导语:今天在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")

StringVarpBoolVarP 用于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失败相关推荐

  1. mac安装EasyConnect、mac使用EasyConnect,mac安装EasyConnectPlugin失败

    系统:MacOS Mojave 10.14.5 因为需要访问内网,刚上手Mac又没有安装这个软件,然后在EasyConnect官网下载安装后,发现竟然连不上,软件提示:"客户端版本与服务器不 ...

  2. 解决Mac安装Homebrew失败

    首先使用Homebrew官网的安装shell命令安装: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr ...

  3. [经历分享]Mac安装Windows10失败/计算机意外地重新启动或遇到错误/无限蓝屏critical process died/尝试访问启动磁盘设置时出错

    [经历分享]Mac安装Windows10失败/计算机意外地重新启动或遇到错误/无限蓝屏critical process died/Bootcamp尝试访问启动磁盘设置时出错/window10安装一直卡 ...

  4. 解决Paragon NTFS for Mac安装分卷失败的办法

    安装好Paragon NTFS for Mac后,将移动硬盘连接到Mac电脑上时会跳出如图一所示问题,显示安装分卷失败.下面是macw小编带来的解决办法. 解决方法 依次点击[系统偏好设置]→[安全性 ...

  5. mbp安装steam显示“steam_osx”已损坏,mac安装steam方法

    我的电脑系统. 刚开始下载steam的时候,也是各种文件损坏.以下是我的安装步骤 1.我使用上面的方法用终端输了一遍"sudo spctl --master-disable",原本 ...

  6. -已解决-NVIDIA安装程序失败-win10

    这个错误界面没截图,去别的地方盗过来一个 我的电脑显示cuda版本是11.0的,所以一直努力装11.0版本的,新电脑刚开始装的前几次还没问题,卸的次数多了报应就来了,一直报错,整的都快崩溃了,现在解决 ...

  7. mac安装brew失败怎么办?

    试了好多种办法都不行,这个可以: 运行下面自动脚本(已经全部替换为国内地址): /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/Home ...

  8. mac安装brew失败443

    https://blog.csdn.net/yanhaijunyan/article/details/114841742

  9. mac安装brew(亲测有效)

    在网上搜了很多brew安装方式,包括使用官网的方式都安装报错 Failed to connect to raw.githubusercontent.com port 443: Connection r ...

最新文章

  1. 嵌入式学习笔记-LM75温度传感器驱动总结
  2. 四部门发文!坚决避免数据中心盲目无序发展
  3. 快速定位关键爆破点的几种方法
  4. MySQL如何创建表时指定约束
  5. erdas2015几何校正模块在哪_erdas图像几何校正操作步骤指南
  6. __stdcall c++ 默认_JMeter必知必会系列(6) JMeter参数化之__CSVRead()
  7. 2014\Province_C_C++_B\2 切面条
  8. LiveVideoStack线上分享第四季(五):基于Airflow的视频编码平台
  9. 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演
  10. SpringBoot项目请求路径中有正反斜杠的处理办法
  11. 1002.ubuntu系统级BUG-/dev/ttyUSB0
  12. 比反射更快:委托 第3部分
  13. (轉貼) 如何解決MegaCore IP 6.0安裝時-6001的錯誤? (IC Design) (MegaCore)
  14. matlab矩阵的表示和简单操作
  15. linux虚拟机的密钥,Linux虚拟机之间实现密钥登陆
  16. 小程序实现列表和详情页
  17. 从高考落榜生到网络专家
  18. 计算机参数怎么写,format命令的怎样写 format命令的格式和参数【详解】
  19. 药物研发检测记录模板-0903不溶性微粒检查法检验原始记录
  20. 怎么从网上办大流量卡呢?具体步骤小编都给你写好的!

热门文章

  1. 浙江移动2018暑期实习生经历
  2. Python基础篇5:输入两个数,求它们的和、差、积、商、余数
  3. 【方法】Latex多行公式及编号
  4. artemis mq配置开机启动 (centos7)(artemis Init Script)
  5. 关于免费的seo网站推广方法有哪些?
  6. 5G基础学习1、5G网络架构、网络接口及协议栈
  7. 用GPIO模拟SPI接口读取传感器数据
  8. 包围盒----碰撞检测
  9. linux环境下python机器学习环境的搭建
  10. android qq自动发红包,Android实现QQ抢红包插件