[问题已处理]-mac安装cobra失败
导语:今天在mac环境中没法成功安装cobra,记录一下避免以后踩坑。
执行go get报错
更换安装方式 安装cobra-cli
go get -u github.com/spf13/cobra@latest
go install github.com/spf13/cobra-cli@latest
cp /Users/xujiamin/go/bin/cobra-cli /Users/xujiamin/go/bin/cobra
测试cobra的功能是否可用
cobra-cli init
go run main.go
添加子命令
cobra-cli add wget
cobra-cli add ping
在wget.go 中定义了一个wgetCmd结构体指针,可通过查看Command结构体原型添加或移除成员变量。这里我们添加了一个Example
用于指示示例,Short和Long为命令简介,Run为wget命令的真正实现。
我们知道在go中包的init()函数会在import时执行,通过AddCommand(wgetCmd)
将wegetCmd添加到结构体Command
成员变量commands中,包括后面我们编写的Flag也是如此。
接下来我们在结构体中添加Args用于验证(限制)参数数量,在init()函数中添加Flag -o
用于保存下载的文件地址,并通过MarkFlagRequired
约束flag的参数必须输入,最后在Run中调用Download即可。
# wget.go
package cmdimport ("fmt""io""log""net/http""os""github.com/spf13/cobra"
)var (output string
)// wgetCmd represents the wget command
var wgetCmd = &cobra.Command{Use: "wget",Example: "xpower wget iqsing.github.io/download.tar.gz -o /tmp/download.tar.gz",Args: cobra.ExactArgs(1),Short: "wget is a download cli.",Long: `use wget to download everything you want from net.`,Run: func(cmd *cobra.Command, args []string) {fmt.Println("---wget running---")Download(args[0], output)},
}func init() {rootCmd.AddCommand(wgetCmd)// Here you will define your flags and configuration settings.wgetCmd.Flags().StringVarP(&output, "output", "o", "", "output file")wgetCmd.MarkFlagRequired("output")
}
func Download(url string, path string) {out, err := os.Create(path)check(err)defer out.Close()res, err := http.Get(url)check(err)defer res.Body.Close()_, err = io.Copy(out, res.Body)check(err)fmt.Println("save as" + path)
}
func check(err error) {if err != nil {log.Fatal(err)}
}
args
Args: cobra.ExactArgs(1)
cobra内置的参数验证也是比较多,NoArgs、OnlyValidArgs、MinimumNArgs、MaximumNArgs等等可翻阅源码args.go,可以满足基本使用,如果有自己的特殊要求可以通过解析arg来实现。
flags
wgetCmd.Flags().StringVarP(&output, "output", "o", "", "output file(required)")
flag包含局部和全局两种,全局flag在父命令定义后子命令也会生效,而局部flag则在哪定义就在哪生效。
如上面的局部flag,我们在wgetCmd中定义的flag只有wget这个子命令能用。
全局flag
rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
StringVarp
、BoolVarP
用于flag数据类型限制。
简单的应用从命令行直接写入参数是很常见的,但是如果比较复杂的命令行应用参数需要非常多,再这样操作不太合理,cobra作者还写了另一个在go中很流行的包viper用于解析配置文件,比如kubectl 的yml,以及各种json
前面也说过可以无缝衔接,只需Bind一下即可。
var author stringfunc init() {rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution")viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
}
flag还可以做依赖,比如下面username和password必须同时接收到参数。
rootCmd.Flags().StringVarP(&u, "username", "u", "", "Username (required if password is set)")
rootCmd.Flags().StringVarP(&pw, "password", "p", "", "Password (required if username is set)")
rootCmd.MarkFlagsRequiredTogether("username", "password")
https://zhuanlan.zhihu.com/p/501304994
https://pkg.go.dev/github.com/spf13/cobra?tab=versions
[问题已处理]-mac安装cobra失败相关推荐
- mac安装EasyConnect、mac使用EasyConnect,mac安装EasyConnectPlugin失败
系统:MacOS Mojave 10.14.5 因为需要访问内网,刚上手Mac又没有安装这个软件,然后在EasyConnect官网下载安装后,发现竟然连不上,软件提示:"客户端版本与服务器不 ...
- 解决Mac安装Homebrew失败
首先使用Homebrew官网的安装shell命令安装: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr ...
- [经历分享]Mac安装Windows10失败/计算机意外地重新启动或遇到错误/无限蓝屏critical process died/尝试访问启动磁盘设置时出错
[经历分享]Mac安装Windows10失败/计算机意外地重新启动或遇到错误/无限蓝屏critical process died/Bootcamp尝试访问启动磁盘设置时出错/window10安装一直卡 ...
- 解决Paragon NTFS for Mac安装分卷失败的办法
安装好Paragon NTFS for Mac后,将移动硬盘连接到Mac电脑上时会跳出如图一所示问题,显示安装分卷失败.下面是macw小编带来的解决办法. 解决方法 依次点击[系统偏好设置]→[安全性 ...
- mbp安装steam显示“steam_osx”已损坏,mac安装steam方法
我的电脑系统. 刚开始下载steam的时候,也是各种文件损坏.以下是我的安装步骤 1.我使用上面的方法用终端输了一遍"sudo spctl --master-disable",原本 ...
- -已解决-NVIDIA安装程序失败-win10
这个错误界面没截图,去别的地方盗过来一个 我的电脑显示cuda版本是11.0的,所以一直努力装11.0版本的,新电脑刚开始装的前几次还没问题,卸的次数多了报应就来了,一直报错,整的都快崩溃了,现在解决 ...
- mac安装brew失败怎么办?
试了好多种办法都不行,这个可以: 运行下面自动脚本(已经全部替换为国内地址): /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/Home ...
- mac安装brew失败443
https://blog.csdn.net/yanhaijunyan/article/details/114841742
- mac安装brew(亲测有效)
在网上搜了很多brew安装方式,包括使用官网的方式都安装报错 Failed to connect to raw.githubusercontent.com port 443: Connection r ...
最新文章
- 嵌入式学习笔记-LM75温度传感器驱动总结
- 四部门发文!坚决避免数据中心盲目无序发展
- 快速定位关键爆破点的几种方法
- MySQL如何创建表时指定约束
- erdas2015几何校正模块在哪_erdas图像几何校正操作步骤指南
- __stdcall c++ 默认_JMeter必知必会系列(6) JMeter参数化之__CSVRead()
- 2014\Province_C_C++_B\2 切面条
- LiveVideoStack线上分享第四季(五):基于Airflow的视频编码平台
- 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演
- SpringBoot项目请求路径中有正反斜杠的处理办法
- 1002.ubuntu系统级BUG-/dev/ttyUSB0
- 比反射更快:委托 第3部分
- (轉貼) 如何解決MegaCore IP 6.0安裝時-6001的錯誤? (IC Design) (MegaCore)
- matlab矩阵的表示和简单操作
- linux虚拟机的密钥,Linux虚拟机之间实现密钥登陆
- 小程序实现列表和详情页
- 从高考落榜生到网络专家
- 计算机参数怎么写,format命令的怎样写 format命令的格式和参数【详解】
- 药物研发检测记录模板-0903不溶性微粒检查法检验原始记录
- 怎么从网上办大流量卡呢?具体步骤小编都给你写好的!