go可以交叉编译成linux、win、mac系统的二进制文件,很适合用于开发cli工具。
以下演示开发一个简单的cli工具,使用cobra组件来实现,编写一个简单的Say Hello Demo
初始化项目
使用go modules来管理包。所以需要先开启,并且切换国内代理,不然依赖可能拉不下来
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct
初始化工程
go mod init gitee.com/jenson343/jtoolkit
拉取cobra
go get -u github.com/spf13/cobra@v1.0.0
编写子命令
cobra 可以编写子命令,子命令便于区分不同的功能,方便用于开发工具集CLI
在项目根目录下创建cmd目录,并编写子命令代码hello.go
mkdir cmd
touch hello.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
"strings"
)
var helloCmdDesc = strings.Join([]string{
"该子命令用于测试cobra命令行组件,参数如下:",
"-n:名称,输出 hello xxx",
}, "\n")
// 接收输入参数
var hcName string
var helloCmd = &cobra.Command{
Use: "hello",
Short: "say hello",
Long: helloCmdDesc,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("hello " + hcName)
},
}
func init() {
helloCmd.Flags().StringVarP(&hcName, "name", "n", "warrior", "输入名称")
}
添加子命令
在init函数中将子命令加入根命令中
touch root.go
package cmd
import "github.com/spf13/cobra"
var rootCmd = &cobra.Command{}
func Execute() error {
return rootCmd.Execute()
}
func init() {
rootCmd.AddCommand(helloCmd)
}
在main函数中调用命令
touch main.go
package main
import (
"gitee.com/jenson343/jtoolkit/cmd"
"log"
)
func main() {
err := cmd.Execute()
if err != nil {
log.Fatalf("cmd.Execute err: %v", err)
}
}
测试
localhost:jtoolkit Jenson$ go run main.go hello -n jenson
hello jenson
localhost:jtoolkit Jenson$ go run main.go hello --name jenson
hello jenson
localhost:jtoolkit Jenson$
gitee: gitee.com/jenson343/jtoolkit
网友评论