>백엔드 개발 >Golang >일반적인 골랑 라이브러리 코브라

일반적인 골랑 라이브러리 코브라

藏色散人
藏色散人앞으로
2021-05-13 11:53:282626검색

다음 튜토리얼 칼럼인 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]:编辑某一篇文章

计划有以下几个步骤

  • 创建模块
  • 用cobra的命令行,创建命令行入口
  • 用cobra的命令行,创建子命令
  • 编写功能逻辑

创建模块

$ 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

구체적인 예를 작성하고 4개의 하위 명령이 있는 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

명령줄 항목 만들기

말하기 명령줄의 경우 다양한 스타일의 명령줄을 구문 분석할 수 있는 bash의 getopt 또는 java의 jcommand를 생각할 수 있지만 일반적으로 이러한 명령줄에는 고정된 작성 방식이 있으므로 일반적으로 이러한 작성 방법을 기억할 수 없습니다. 템플릿을 찾아 다음을 참고하세요. 명령줄을 구문 분석하는 것 외에도 cobra는 템플릿을 생성할 수 있는 명령줄도 제공합니다. 이 명령줄을 먼저 설치하고 go.mod
    go build  -o blog .
  • 에 라이브러리 종속성을 추가하면 Cobra는 $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.
  • Directory의 PATH에 추가하는 데 주의하세요. 구조는 다음과 같습니다.
  • go get -u test.com/a/b
  • Compile
  • // 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

    그래서 명령줄은 세 부분으로 구성되어 있으므로 command로 표현되는

    명령 자체의 일부 기본 정보를 정의해야 하며, 특정 개체는 cobra.Command

    명령의 일부 기호 또는 옵션이며, 플래그로 표시되며, 특정 객체는 플래그입니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제