返回顶部
首页 > 资讯 > 后端开发 > GO >如何在golang中使用cobra库
  • 288
分享到

如何在golang中使用cobra库

2023-06-15 01:06:53 288人浏览 安东尼
摘要

如何在golang中使用cobra库?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。cobra  是 Go 语言的一个库,可以用于编写命令行工具。通常我

如何在golang中使用cobra库?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

cobra  是 Go 语言的一个库,可以用于编写命令行工具。通常我们可以看到git pull  、Docker container start  、apt install 等等这样命令,都可以很容易用corba来实现,另外,go 语言是很容易编译成一个二进制文件,本文将实现一个简单的命令行工具。

具体写一个例子, 设计一个命令叫blog, 有四个子命令

 blog new [post-name] :创建一篇新的blog blog list   :列出当前有哪些文章 blog delete [post-name]: 删除某一篇文章 blog edit [post-name]:编辑某一篇文章

计划有以下几个步骤

  • 创建模块

  • 用cobra的命令行,创建命令行入口

  • 用cobra的命令行,创建子命令

  • 编写功能逻辑

创建模块

$ go mod init GitHub.com/shalk/bloggo: creating new go.mod: module github.com/shalk/blog

创建命令行入口

说到命令行,可能会想到bash的getopt 或者 java 的jcommand,可以解析各种风格的命令行,但是通常这些命令行都有固定的写法,这个写法一般还记不住要找一个模板参考以下。cobra除了可以解析命令行之外,还提供了命令行,可以生成模板。先安装这个命令行, 并且把库的依赖加到go.mod里

$ go get -u github.com/spf13/cobra/cobra

cobra会安装到$GOPATH\bin 目录下,注意环境变量中把它加入PATH中

$ cobra init --pkg-name github.com/shalk/blog -a shalk -l mitYour Cobra applicaton is ready atD:\code\github.com\shalk\blog

目录结构如下:

./cmd./cmd/root.go./go.mod./go.sum./LICENSE./main.go

编译一下

go build  -o blog .

执行一下

$blog -hA longer description that spans multiple lines and likely containsexamples and usage of using your application. For example:Cobra is a CLI library for Go that empowers applications.This application is a tool to generate the needed filesto quickly create a Cobra application.

命令行就创建好了,看上去一行代码也不用写,由于随着了解的深入,后面需要调整生成的代码,还是要了解一下cobra代码的套路。

cobra代码的套路

有三个概念,command、flag和args  ,例如:

go get -u test.com/a/b

这里 get 就是commond(这里比较特殊), -u 就是flag, test.com/a/b 就是args

那么命令行就是有三部分构成,所以需要定义好这个

  • 命令自身的一些基本信息,用command表示,具体对象是 cobra.Command

  • 命令的一些标致或者选项,用flag表示,具体对象是 flag.FlagSet

  • 最后的参数,用args表示,通常是[]string

还有一个概念是子命令,比如get就是go的子命令,这是一个树状结构的关系。

我可以使用go命令,也可以使用 go get命令

例如:  root.go,定义了root命令,另外在init里面 定义了flag,如果它本身有具体执行,就填充Run字段。

// rootCmd represents the base command when called without any subcommandsvar rootCmd = &cobra.Command{Use:   "blog",Short: "A brief description of your application",Long: `A longer description that spans multiple lines and likely containsexamples and usage of using your application. For example:Cobra is a CLI library for Go that empowers applications.This application is a tool to generate the needed filesto quickly create a Cobra application.`,// Uncomment the following line if your bare application// has an action associated with it://Run: func(cmd *cobra.Command, args []string) { },}// Execute adds all child commands to the root command and sets flags appropriately.// This is called by main.main(). It only needs to happen once to the rootCmd.func Execute() {if err := rootCmd.Execute(); err != nil {fmt.Println(err)os.Exit(1)}}func init() {cobra.OnInitialize(initConfig)// Here you will define your flags and configuration settings.// Cobra supports persistent flags, which, if defined here,// will be global for your application.rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.blog.yaml)")// Cobra also supports local flags, which will only run// when this action is called directly.rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")}

如果需要子命令,就需要在init 里,给 rootCmd.AddCommand() 其他的command,其他的子命令通常也会单独用一个文件编写,并且有一个全局变量,让rootCmd可以add它

创建子命令

D:\code\github.com\shalk\blog>cobra add  newnew created at D:\code\github.com\shalk\blogD:\code\github.com\shalk\blog>cobra add  deletedelete created at D:\code\github.com\shalk\blogD:\code\github.com\shalk\blog>cobra add  listlist created at D:\code\github.com\shalk\blogD:\code\github.com\shalk\blog>cobra add  editedit created at D:\code\github.com\shalk\blog

cmd 目录下增加了 new.go, delete.go,list.go,edit.go

增加功能代码

new.go

var newCmd = &cobra.Command{Use:   "new",Short: "create new post",Long:  `create new post `,Args: func(cmd *cobra.Command, args []string) error {if len(args) != 1 {return errors.New("requires a color argument")}return nil},Run: func(cmd *cobra.Command, args []string) {fileName := "posts/" + args[0]err := os.Mkdir("posts", 644)if err != nil {log.Fatal(err)}_, err = os.Stat( fileName)if os.IsNotExist(err) {file, err := os.Create(fileName)if err != nil {log.Fatal(err)}log.Printf("create file %s", fileName)defer file.Close()} else {}},}

list.go

var listCmd = &cobra.Command{Use:   "list",Short: "list all blog in posts",Long: `list all blog in posts `,Run: func(cmd *cobra.Command, args []string) {_, err := os.Stat("posts")if os.IsNotExist(err) {log.Fatal("posts dir is not exits")}dirs, err := ioutil.ReadDir("posts")if err != nil {log.Fatal("read posts dir fail")}fmt.Println("------------------")for _, dir := range dirs {fmt.Printf(" %s\n", dir.Name() )}fmt.Println("------------------")fmt.Printf("total: %d blog\n", len(dirs))},}

delete.go

var deleteCmd = &cobra.Command{Use:   "delete",Short: "delete a post",Long: `delete a post`,Args: func(cmd *cobra.Command, args []string) error {if len(args) != 1 {return errors.New("requires a color argument")}if strings.Contains(args[0],"/") || strings.Contains(args[0],"..") {return errors.New("posts name should not contain / or .. ")}return nil},Run: func(cmd *cobra.Command, args []string) {fileName := "./posts/" +  args[0]stat, err := os.Stat(fileName)if os.IsNotExist(err) {log.Fatalf("post %s is not exist", fileName)}if stat.IsDir() {log.Fatalf("%s is dir ,can not be deleted", fileName)}err = os.Remove(fileName)if err != nil {log.Fatalf("delete %s fail, err %v", fileName, err)} else {log.Printf("delete post %s success", fileName)}},}

edit.go 这个有一点麻烦,因为如果调用一个程序比如vim 打开文件,并且golang程序本身要退出,需要detach。暂时放一下(TODO)

编译测试

我是window测试,linux 更简单一点

PS D:\code\github.com\shalk\blog> go build -o blog.exe .PS D:\code\github.com\shalk\blog> .\blog.exe list------------------------------------total: 0 blogPS D:\code\github.com\shalk\blog> .\blog.exe new blog1.md2020/07/26 22:37:15 create file posts/blog1.mdPS D:\code\github.com\shalk\blog> .\blog.exe new blog2.md2020/07/26 22:37:18 create file posts/blog2.mdPS D:\code\github.com\shalk\blog> .\blog.exe new blog3.md2020/07/26 22:37:20 create file posts/blog3.mdPS D:\code\github.com\shalk\blog> .\blog list------------------ blog1.md blog2.md blog3.md------------------total: 3 blogPS D:\code\github.com\shalk\blog> .\blog delete blog1.md2020/07/26 22:37:37 delete post ./posts/blog1.md successPS D:\code\github.com\shalk\blog> .\blog list------------------ blog2.md blog3.md------------------total: 2 blogPS D:\code\github.com\shalk\blog> ls .\posts\    目录: D:\code\github.com\shalk\blog\postsMode                LastWriteTime         Length Name----                -------------         ------ -----a----        2020/7/26     22:37              0 blog2.md-a----        2020/7/26     22:37              0 blog3.mdPS D:\code\github.com\shalk\blog>

golang适合做什么

golang可以做服务器开发,但golang很适合做日志处理、数据打包、虚拟机处理、数据库代理等工作。在网络编程方面,它还广泛应用于WEB应用、api应用等领域。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网GO频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 如何在golang中使用cobra库

本文链接: https://lsjlt.com/news/276573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在golang中使用cobra库
    如何在golang中使用cobra库?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。cobra  是 go 语言的一个库,可以用于编写命令行工具。通常我...
    99+
    2023-06-15
  • 在 Golang 中使用 Cobra 创建 CLI 应用
    虽然现在我们使用的大多数软件都是可视化的,很容易上手,但是这并不代表 CLI(命令行)应用就没有用武之地了,特别是对于开发人员来说,还是会经常和 CLI 应用打交道。而 Golang...
    99+
    2024-04-02
  • 怎么在Golang中使用Cobra创建CLI应用
    本篇内容主要讲解“怎么在Golang中使用Cobra创建CLI应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Golang中使用Cobra创建CLI应用”吧!对于开发人员来说平时可能就需...
    99+
    2023-06-22
  • 如何在 Golang 中使用数据库锁?
    在 golang 中,可以使用 sync.mutex 或 database/sql 包中的 tx 实现数据库锁。sync.mutex 适用于非阻塞操作,而 tx 允许在事务中执行一系列操...
    99+
    2024-05-14
    golang 数据库锁
  • 如何在 Golang 中使用数据库迁移?
    在 golang 中使用数据库迁移可确保数据库与代码同步。可以使用 ent 或 gormigrate 等库执行迁移:使用 ent:安装 ent。生成迁移文件。运行迁移。使用 gormig...
    99+
    2024-05-14
    golang 数据库迁移 git
  • Golang中quicktemplate库如何使用
    Golang中quicktemplate库如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。先创建代码目录并初始化:$ mkdir quicktempl...
    99+
    2023-06-20
  • 如何在golang 中使用Logrus
    如何在golang 中使用Logrus?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。golang Logrus简易使用教程使用Logrus的最简单方法:package&nb...
    99+
    2023-06-15
  • 如何在 Golang 中使用数据库回调函数?
    在 golang 中使用数据库回调函数可以实现:在指定数据库操作完成后执行自定义代码。通过单独的函数添加自定义行为,无需编写额外代码。回调函数可用于插入、更新、删除和查询操作。必须使用 ...
    99+
    2024-05-14
    数据库 回调函数 mysql git golang
  • 如何在Golang中使用协程
    这篇文章将为大家详细讲解有关如何在Golang中使用协程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,并具...
    99+
    2023-06-14
  • Docker API如何在Golang中使用
    Docker API如何在Golang中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。安装 SDK通过下面的命令就可以安装 SDK 了:go get g...
    99+
    2023-06-14
  • 如何在Golang中使用模板
    Golang使用模板的步骤:1、用go get命令安装模板引擎;2、创建一个包含占位符的文本文件;3、使用Parse()方法解析模板;4、使用Execute()方法渲染模板;5、模板变量的解析;6、如果模板需要包含子模板,可以进行模板嵌套;...
    99+
    2023-12-12
    Golang
  • 如何在 Golang 中使用事务?
    在 go 中,可以使用 tx 类型进行事务操作。要开启事务,请使用 db.begin()。在事务块中,执行数据库操作,如查询、更新。执行成功后,使用 tx.commit() 提交事务。在...
    99+
    2024-05-14
    golang 事务
  • 如何在mongodb中使用golang驱动
    如何在mongodb中使用golang驱动?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用教程如下:导入go get g...
    99+
    2024-04-02
  • 如何在Golang中使用Mockery v0.0.0-dev?
    php小编西瓜将为您介绍如何在Golang中使用Mockery v0.0.0-dev。Mockery是一个用于创建和管理mock对象的开源库,它帮助我们在测试过程中模拟依赖项。使用Mo...
    99+
    2024-02-10
  • 如何在 Golang 中使用第三方库生成随机数?
    在 go 中生成随机数时,math/rand 标准库提供基本功能。对于更复杂的需求,可以使用第三方库。github.com/bxcodec/faker 提供了生成随机数据的功能,包括:f...
    99+
    2024-05-13
    golang 随机数 git 标准库
  • 如何在Golang中测试库函数
    在Golang中,测试是确保代码质量的重要环节。无论是开发库函数还是应用程序,都需要进行全面的测试以验证其功能和性能。那么,如何在Golang中测试库函数呢?首先,我们需要编写测试代码...
    99+
    2024-02-09
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-14
    golang 数据库备份 mysql git 标准库
  • 如何在 Golang 中还原数据库?
    go 中存在多种方法可还原数据库:使用 db dump 和 db load 命令行工具进行转储和恢复。使用 pgx 库执行更方便的数据库操作,其中涉及使用 create temp tab...
    99+
    2024-05-15
    golang 还原数据库 git
  • 如何在Golang中使用内建容器
    今天就跟大家聊聊有关如何在Golang中使用内建容器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,...
    99+
    2023-06-14
  • 如何在golang中使用logger日志包
    这篇文章给大家介绍如何在golang中使用logger日志包,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作