Maison  >  Article  >  développement back-end  >  Un cobra commun de la bibliothèque Golang

Un cobra commun de la bibliothèque Golang

藏色散人
藏色散人avant
2021-05-13 11:53:282586parcourir

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

  • Créer un module
  • Utilisez la ligne de commande de Cobra pour créer une entrée de ligne de commande
  • Utilisez la ligne de commande de Cobra pour créer des sous-commandes
  • Écrivez la logique fonctionnelle

Créez des modules

$ go mod init github.com/shalk/blog
go: creating new go.mod: module github.com/shalk/blog

Créer une entrée de ligne de commande

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.go
Compilez-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 Cobra

Il existe trois concepts, commande, drapeau et arguments, par exemple :

go get -u test.com/a/b
Ici, get est commond (c'est plus spécial), -u est flag, test.com/a/b est args

Ensuite, 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

    elle-même, représenté par la commande, et l'objet spécifique. Ce sont quelques fonctionnalités ou options de la commande cobra.Command
  • , représentées par flag. L'objet spécifique est le dernier paramètre de flag.FlagSet
  • , représenté. par args, généralement []string
Un autre concept est celui des sous-commandes. Par exemple, get est une sous-commande de go. Il s'agit d'une relation arborescente.

Je peux utiliser la commande go, ou je peux utiliser la commande go get

Par exemple : root.go définit la commande root, et définit également le drapeau dans init si c'est spécifiquement. exécuté, remplissez simplement le champ Exécuter.

// 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

Répertoire cmd ajouté new.go, delete.go, list.go, edit.go

Ajouter un code de fonction

new.go

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 tester

Je 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer