博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang命令行库Cobra的使用
阅读量:5131 次
发布时间:2019-06-13

本文共 5916 字,大约阅读时间需要 19 分钟。

前言

Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序。许多使用最广泛的Go项目都是使用Cobra构建的,其中包括:

kubernetes
docker
openshift
...

一、安装Cobra

在我们安装Cobra之前,我们先解决大陆网络无法访问的问题(你懂得),否则是无法完成所有工具的安装。这里我们使用Gopm来实现,gopm是Go Package Manager 的缩写。是Golang上的包管理工具,十分好用。

1.1 gopm 安装

go get -u github.com/gpmgo/gopm

这样就将gopm完成了,在对应的$GOPATH/bin目录下即可看到;

1.2 安装Cobra

go get -g github.com/spf13/cobra/cobrago build github.com/spf13/cobra/cobra

提示:在执行go install的时候,需要依赖golang.org/x/相关软件包,请到即可。下载之后,将该包解压到自己的$GOPATH/src目录即可;

二、Cobra相关使用

2.1 使用Cobra生产应用程序

假设现在我们要开发一个基于CLI的命令程序,名字为demo。首先打开CMD,切换到GOPATH的bin目录下,执行如下指令:

cobra init demo

在src目录下会生成一个demo的文件夹,如下:

tree src/demo

src/demo
├── LICENSE
├── cmd
│   └── root.go
└── main.go

测试cobra效果:

demo go run main.go demoA 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.

当初次创建完项目之后,即可使用项目(这里是"demo")来查看效果;

2.2 添加子命令(这里以51reboot培训内容为例)

demo cobra add unbufunbuf created at /Users/yangsheng/go/src/demo/cmd/unbuf.godemo tree.├── LICENSE├── cmd│   ├── root.go│   └── unbuf.go└── main.go

此时目录结构变更为如上所示。现在我们来执行一下这个子命令:

go run main.go unbufunbuf called

2.3 完善子命令功能

创建unbuf代码程序

mkdir unbuf

在该目录下面新建文件unbuf.go文件,具体内容如下:

package unbufimport (    "fmt"    "math/rand"    "sync"    "time")func init() {    rand.Seed(time.Now().UnixNano())}//Player xxxtype Player struct {    User1 string    User2 string}// NewPlayer  create a instance, Player is objectfunc NewPlayer(user1, user2 string) *Player {    return &Player{        User1: user1,        User2: user2,    }}func (p *Player) GoPlayer() {    var wg sync.WaitGroup    ch := make(chan int)    wg.Add(2)    go player(p.User1, ch, &wg)    go player(p.User2, ch, &wg)    ch <- 1    wg.Wait()}//player  two playersfunc player(name string, ch chan int, wg *sync.WaitGroup) {    defer wg.Done()    for {        ball, ok := <-ch        if !ok {            fmt.Printf("%s won!!!\n", name)            break        }        n := rand.Intn(100)        if n%15 == 0 {            fmt.Printf("%s miss,the rand number is %d\n", name, n)            close(ch)            break        }        fmt.Printf("Player %s hit the ball %d,the rand number is %d\n", name, ball, n)        ball++        ch <- ball    }}func Runner() {    var wg sync.WaitGroup    ch := make(chan int)    wg.Add(1)    go run(ch, &wg)    ch <- 1    wg.Wait()}func run(ch chan int, wg *sync.WaitGroup) {    var newRunner int    runner := <-ch    fmt.Printf("runner %d running with Baton\n", runner)    if runner != 4 {        newRunner = runner + 1        fmt.Printf("runner %d to the line\n", runner)        go run(ch, wg)    }    // rand sleep time    n := rand.Intn(100)    time.Sleep(time.Duration(n) * time.Millisecond)    if runner == 4 {        fmt.Printf("runner %d finish,Race over\n", runner)        wg.Done()        return    }    fmt.Printf("runner %d exchange with runner %d\n", runner, newRunner)    ch <- newRunner}

对子命令进行完善,具体代码如下:

// Copyright © 2018 NAME HERE 
//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at//// http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.package cmdimport ( "fmt" "github.com/51reboot/golang-03-homework/lesson8/jkak/unbuf" "github.com/spf13/cobra")// unbufCmd represents the unbuf commandvar unbufCmd = &cobra.Command{ Use: "unbuf", Short: "A brief description of your command", Long: `A longer description that spans multiple lines and likely contains examplesand usage of using your command. 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.`, Run: func(cmd *cobra.Command, args []string) { fmt.Println("unbuf called") // TODO: work your own magic here obj := unbuf.NewPlayer("chen", "song") obj.GoPlayer() fmt.Println("\n-- start running --\n") unbuf.Runner() },}func init() { rootCmd.AddCommand(unbufCmd) // Here you will define your flags and configuration settings. // Cobra supports Persistent Flags which will work for this command // and all subcommands, e.g.: // unbufCmd.PersistentFlags().String("foo", "", "A help for foo") // Cobra supports local flags which will only run when this command // is called directly, e.g.: // unbufCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")}

到此一个简单demo功能就已经实现,我们运行一下看看实际效果:

go run main.go unbufunbuf calledPlayer song hit the ball 1,the rand number is 12Player chen hit the ball 2,the rand number is 69Player song hit the ball 3,the rand number is 58Player chen hit the ball 4,the rand number is 77Player song hit the ball 5,the rand number is 83Player chen hit the ball 6,the rand number is 31Player song hit the ball 7,the rand number is 16Player chen hit the ball 8,the rand number is 67Player song hit the ball 9,the rand number is 78chen miss,the rand number is 15song won!!!-- start running --runner 1 running with Batonrunner 1 to the linerunner 1 exchange with runner 2runner 2 running with Batonrunner 2 to the linerunner 2 exchange with runner 3runner 3 running with Batonrunner 3 to the linerunner 3 exchange with runner 4runner 4 running with Batonrunner 4 finish,Race over

Cobra的使用就介绍到这里,更新细节可去详细研究一下。这里只是一个简单的使用入门介绍,如果有错误之处,敬请指出,谢谢~

最后文中用到的代码,如有侵权,请与我联系;

转载于:https://www.cnblogs.com/yangxiaoyi/p/9221683.html

你可能感兴趣的文章
AS3优化性能笔记二
查看>>
ElasticSearch(站内搜索)
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>
UVA 11137 - Ingenuous Cubrency
查看>>
js阻止事件冒泡的两种方法
查看>>
Java异常抛出
查看>>
[SQL Server 系] T-SQL数据库的创建与修改
查看>>
74HC164应用
查看>>
变量声明和定义的关系
查看>>
Wpf 之Canvas介绍
查看>>
linux history
查看>>
jQuery on(),live(),trigger()
查看>>
Python2.7 urlparse
查看>>
sencha touch在华为emotion ui 2.0自带浏览器中圆角溢出的bug
查看>>
【架构】Linux的架构(architecture)
查看>>
ASM 图解
查看>>
Date Picker控件:
查看>>
你的第一个Django程序
查看>>
grafana授权公司内部邮箱登录 ldap配置
查看>>
treegrid.bootstrap使用说明
查看>>