nirvana 命令

Nirvana 命令对应的包在 cmd/nirvana 中,目前包括三个命令:

  1. init,用于初始化标准项目目录结构和必要文件
  2. api,用于生成 API 文档(需要确保使用的是标准的项目结构,否则可能无法正常工作)
  3. client,用于生成 API 对应的客户端(需要确保使用的是标准的项目结构,否则可能无法正常工作)。

每个命令都是一个目录,互相之间不干扰。每个目录都有一个 init.go 的文件用于把当前的命令加入到 Nirvana 根命令中,比如:

  1. package project
  2. import "github.com/spf13/cobra"
  3. // Register registers all commands.
  4. func Register(root *cobra.Command) {
  5. root.AddCommand(newInitCommand())
  6. }

然后在 main.go 中 import 这个包并进行命令注册:

  1. import (
  2. "github.com/caicloud/nirvana/cmd/nirvana/api"
  3. "github.com/caicloud/nirvana/cmd/nirvana/client"
  4. "github.com/caicloud/nirvana/cmd/nirvana/project"
  5. "github.com/caicloud/nirvana/log"
  6. "github.com/spf13/cobra"
  7. )
  8. var root = &cobra.Command{
  9. Use: "nirvana",
  10. Short: "Nirvana toolchains",
  11. }
  12. func main() {
  13. project.Register(root)
  14. api.Register(root)
  15. client.Register(root)
  16. if err := root.Execute(); err != nil {
  17. log.Fatalln(err)
  18. }
  19. }

接下来以 init 命令为例,说明单个命令的基本结构:

  1. func newInitCommand() *cobra.Command {
  2. options := &initOptions{}
  3. cmd := &cobra.Command{
  4. Use: "init /path/to/project",
  5. Short: "Create a basic project structure",
  6. Long: options.Manuals(),
  7. Run: func(cmd *cobra.Command, args []string) {
  8. if err := options.Validate(cmd, args); err != nil {
  9. log.Fatalln(err)
  10. }
  11. if err := options.Run(cmd, args); err != nil {
  12. log.Fatalln(err)
  13. }
  14. },
  15. }
  16. options.Install(cmd.PersistentFlags())
  17. return cmd
  18. }
  19. type initOptions struct {
  20. Boilerplate string
  21. Version string
  22. Registries []string
  23. ImagePrefix string
  24. ImageSuffix string
  25. BuildImage string
  26. RuntimeImage string
  27. }
  28. func (o *initOptions) Install(flags *pflag.FlagSet) {
  29. flags.StringVar(&o.Boilerplate, "boilerplate", "", "Path to boilerplate")
  30. flags.StringVar(&o.Version, "version", "v0.1.0", "First version of the project")
  31. flags.StringSliceVar(&o.Registries, "registries", []string{}, "Docker image registries")
  32. flags.StringVar(&o.ImagePrefix, "image-prefix", "", "Docker image prefix")
  33. flags.StringVar(&o.ImageSuffix, "image-suffix", "", "Docker image suffix")
  34. flags.StringVar(&o.BuildImage, "build-image", "golang:latest", "Golang image for building the project")
  35. flags.StringVar(&o.RuntimeImage, "runtime-image", "debian:jessie", "Docker base image for running the project")
  36. }
  37. func (o *initOptions) Validate(cmd *cobra.Command, args []string) error
  38. func (o *initOptions) Run(cmd *cobra.Command, args []string) error

基本结构如下:

  1. 一个创建命令的私有函数 newInitCommand
  2. 一个表示当前命令的所有参数的 initOptions
    • Options 实现的 Install 方法用于安装 flag 到命令中
    • Options 实现的 Validate 方法用于验证参数是否正确
    • Options 实现的 Run 方法真正执行命令对应的逻辑

如果需要新增命令扩展 Nirvana 的功能,需要按照上述结构进行开发。