go - 当文件位于文件夹中时无法添加新的 cobra CLI 命令

标签 go command go-cobra

我正在使用 cobra 构建 CLI。
我想创建一个名为 config 的新命令,它将位于文件 config.go 和文件夹 proxy 中。

这是结构:

MyProject
├── cmd
|  ├── proxy
|  |    └── config.go
|  └── root.go
└── main.go  

我用 cobra 创建了命令:

cobra add config  

它在 cmd 下创建了文件,我将文件移动到 proxy 文件夹下(如上面的结构所示​​)。

问题是没有添加命令。
这是 config.go 代码:

// config.go
package cmd

import (
    "fmt"
    "github.com/spf13/cobra"
    "MyProject/cmd"
)

var configCmd = &cobra.Command{
    Use:   "config",
    Short: "A brief description.",
    Long: `A longer description.`,
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("config called")
    },
}

func init() {
    cmd.RootCmd.AddCommand(configCmd)
}

它构建成功,但是当我运行 MyProj.exe -h 时我没有看到命令。
我做错了什么吗?

最佳答案

该包未包含在构建中,因此该命令永远不会初始化。

Go 构建包。当您构建 cmd 包时,将编译该包中的所有 go 文件,并调用所有 init() 函数。但是如果没有任何东西引用 proxy 包,它就不会被编译。

你的代理包里面有package cmd,所以那个包就是proxy目录下的一个cmd包。您应该将其重命名为 proxy 包。

然后,将其包含在构建中。在 main.go 中:

import {
  _ "github.com/MyProject/cmd/proxy"
}

这将导致该包的 init() 运行,并将其自身添加到命令中。

关于go - 当文件位于文件夹中时无法添加新的 cobra CLI 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61011873/

相关文章:

go - 如何仅提取在 cli 中明确设置的标志集?

linux - 如何优雅地关闭在 Kubernetes 上运行的 Go 服务

c - 目前有哪些方法可以让您在 C 中调用 Go 函数?

templates - 如何使用结构或变量值的字段作为模板名称?

multithreading - golang可以启动多线程来处理网络IO吗

c# - 从 DatePicker 触发命令或触发器

shell - 具有不同文件扩展名的ffmpeg图像concat文件

php - 为什么 PHP 反引号和 SSH 不返回相同的值?

json - 如何提供 JSON 数组作为 cobra cli 的参数

go - Cobra COMMAND 未完全执行