다음 튜토리얼 칼럼인 golang에서는 일반적인 고랭 라이브러리인 코브라에 대해 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
cobra는 명령줄 도구를 작성하는 데 사용할 수 있는 go 언어 라이브러리입니다. 일반적으로 git pull
, docker Container start
, apt install
및 corba로 쉽게 구현할 수 있는 기타 명령을 볼 수 있습니다. 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]:编辑某一篇文章
计划有以下几个步骤
$ go mod init github.com/shalk/blog go: 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会安装到$GOPATHbin
blog
라는 명령을 설계합니다.
$ cobra init --pkg-name github.com/shalk/blog -a shalk -l mit Your Cobra applicaton is ready at D:\code\github.com\shalk\blog계획에는 다음 단계가 있습니다
모듈 만들기
cobra의 명령줄을 사용하여 명령줄 만들기 항목
기능적 논리 작성
./cmd ./cmd/root.go ./go.mod ./go.sum ./LICENSE ./main.go
go build -o blog .
$GOPATHbin
디렉터리에 설치됩니다. 환경 변수$blog -h A longer description that spans multiple lines and likely contains examples 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 files to quickly create a Cobra application.
go get -u test.com/a/b
// rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ Use: "blog", Short: "A brief description of your application", Long: `A longer description that spans multiple lines and likely contains examples 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 files to 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") }Execute
D:\code\github.com\shalk\blog>cobra add new new created at D:\code\github.com\shalk\blog D:\code\github.com\shalk\blog>cobra add delete delete created at D:\code\github.com\shalk\blog D:\code\github.com\shalk\blog>cobra add list list created at D:\code\github.com\shalk\blog D:\code\github.com\shalk\blog>cobra add edit edit created at D:\code\github.com\shalk\blog명령줄이 생성됩니다. 이해가 깊어지면 나중에 생성된 코드를 한 줄도 작성할 필요가 없을 것 같습니다. , 따라서 여전히 코브라 코드를 이해해야 합니다. Cobra 코드 루틴명령, 플래그, 인수라는 세 가지 개념이 있습니다. 예를 들면 다음과 같습니다.
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 { } }, }여기서 get은 commond(더 특별함), -u는 플래그, test.com/a/b는 args
명령의 일부 기호 또는 옵션이며, 플래그로 표시되며, 특정 객체는 플래그입니다. FlagSet
의 마지막 매개변수는 args, 일반적으로 []string
로 표시됩니다. 또 다른 개념은 하위 명령입니다. 구조 관계. go 명령이나 go get 명령을 사용할 수 있습니다예: root.go는 루트 명령을 정의하고 init에서도 플래그를 정의합니다. 구체적으로 실행하면 Run 필드가 채워집니다.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)) }, }하위 명령이 필요한 경우 init에서 rootCmd.AddCommand()에 다른 명령을 주어야 합니다. 다른 하위 명령은 일반적으로 별도의 파일에 작성되며 rootCmd가 이를 추가할 수 있도록 전역 변수가 있습니다 하위 명령 만들기
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) } }, }cmd 디렉토리에 new.go, delete.go, list.go, edit.go 추가🎜🎜기능 코드 추가🎜🎜new.go🎜
PS D:\code\github.com\shalk\blog> go build -o blog.exe . PS D:\code\github.com\shalk\blog> .\blog.exe list ------------------ ------------------ total: 0 blog PS D:\code\github.com\shalk\blog> .\blog.exe new blog1.md 2020/07/26 22:37:15 create file posts/blog1.md PS D:\code\github.com\shalk\blog> .\blog.exe new blog2.md 2020/07/26 22:37:18 create file posts/blog2.md PS D:\code\github.com\shalk\blog> .\blog.exe new blog3.md 2020/07/26 22:37:20 create file posts/blog3.md PS D:\code\github.com\shalk\blog> .\blog list ------------------ blog1.md blog2.md blog3.md ------------------ total: 3 blog PS D:\code\github.com\shalk\blog> .\blog delete blog1.md 2020/07/26 22:37:37 delete post ./posts/blog1.md success PS D:\code\github.com\shalk\blog> .\blog list ------------------ blog2.md blog3.md ------------------ total: 2 blog PS D:\code\github.com\shalk\blog> ls .\posts\ 目录: D:\code\github.com\shalk\blog\posts Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020/7/26 22:37 0 blog2.md -a---- 2020/7/26 22:37 0 blog3.md PS D:\code\github.com\shalk\blog>🎜list.go🎜rrreee🎜delete.go🎜rrreee 🎜edit.go 이 파일을 열기 위해 vim과 같은 프로그램을 호출하고 golang 프로그램 자체가 종료되길 원할 경우 이를 분리해야 하기 때문에 약간 번거롭습니다. 지금은 따로 두자(TODO)🎜🎜컴파일 및 테스트🎜🎜윈도우에서 테스트 중인데 Linux가 좀 더 간단해요🎜rrreee🎜요약🎜🎜cobra는 효율적인 명령줄 구문 분석 라이브러리입니다. cobra의 스캐폴딩을 사용하면 빠르게 구현할 수 있습니다. 명령줄 도구. 좀 더 세부적인 제어가 필요하다면 코브라의 공식 문서를 참고하시면 됩니다. 🎜
위 내용은 일반적인 골랑 라이브러리 코브라의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!