Maison > Article > développement back-end > Un cobra commun de la bibliothèque Golang
La colonne tutorielle suivante de golang vous présentera cobra, une bibliothèque golang commune. J'espère qu'elle sera utile aux amis dans le besoin !
cobra est une bibliothèque en langage go qui peut être utilisée pour écrire des outils en ligne de commande. Habituellement, nous pouvons voir des commandes telles que git pull
, docker container start
, apt install
, etc., qui peuvent être facilement implémentées à l'aide de corba. De plus, le langage go est facile à compiler dans un fichier binaire. outils de ligne de commande simples.
Écrivez un exemple spécifique, concevez une commande appelée blog
, avec quatre sous-commandes
blog new [post-name] :创建一篇新的blog blog list :列出当前有哪些文章 blog delete [post-name]: 删除某一篇文章 blog edit [post-name]:编辑某一篇文章
Le plan comporte les étapes suivantes
$ go mod init github.com/shalk/blog go: creating new go.mod: module github.com/shalk/blog
En parlant de ligne de commande, vous pouvez penser à getopt de bash ou à jcommand de java, qui peuvent analyser différents styles de lignes de commande, mais ces lignes de commande ont généralement des méthodes d'écriture fixes, Je ne me souviens généralement pas comment écrire ceci, je dois donc trouver un modèle et me référer à ce qui suit. En plus d'analyser la ligne de commande, cobra fournit également une ligne de commande qui peut générer des modèles. Installez d'abord cette ligne de commande et ajoutez les dépendances de la bibliothèque à go.mod
$ go get -u github.com/spf13/cobra/cobra
cobra sera installé dans le répertoire $GOPATHbin
Faites attention à l'ajouter au PATH dans la variable d'environnement
$ cobra init --pkg-name github.com/shalk/blog -a shalk -l mit Your Cobra applicaton is ready at D:\code\github.com\shalk\blog<.> La structure des répertoires est la suivante :
./cmd ./cmd/root.go ./go.mod ./go.sum ./LICENSE ./main.goCompilez-le
go build -o blog .Exécutez-le
$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.La ligne de commande sera créée. Il semble que vous n'ayez pas besoin de le faire. écrivez une seule ligne de code, car avec l'approfondissement de la compréhension, vous devez ajuster le code généré plus tard, et vous devez toujours comprendre la routine du code cobra. Routines de code CobraIl existe trois concepts, commande, drapeau et arguments, par exemple :
go get -u test.com/a/bIci, get est commond (c'est plus spécial), -u est flag, test.com/a/b est argsEnsuite, la ligne de commande est composée de trois parties, il est donc nécessaire de définir quelques informations de base de la commande
// 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") }Si vous avez besoin de sous-commandes, vous devez donner d'autres commandes à rootCmd.AddCommand() dans init. Les autres sous-commandes sont généralement écrites dans un fichier séparé et ont une variable globale afin que rootCmd puisse l'ajouter
Créer des sous-commandes
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
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 C'est un peu gênant, car si vous appelez un programme tel que vim pour ouvrir le fichier, et le Le programme Golang lui-même doit se détacher pour quitter. Mettons ça de côté pour l'instant (TODO) Compiler et testerJe teste sur window, Linux c'est plus simple
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>Résumécobra est un Ligne de commande efficace La bibliothèque d'analyse utilise l'échafaudage de Cobra pour implémenter rapidement un outil de ligne de commande. Si vous avez besoin d'un contrôle plus détaillé, vous pouvez vous référer à la documentation officielle de Cobra.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!