我有以下用于CLI A(查看真正的存储库)的命令:
$ cli-a -h
Usage:
cli-a [command]
Available Commands:
command-a1 command description
command-a2 command description
command-a3 command description
Flags:
--config string config file (default is $HOME/.cli-a.json)
-h, --help help for cli-a
Use "cli-a [command] --help" for more information about a command.对于CLI,我有以下命令(查看真正的存储库):
$ cli-b -h
Usage:
cli-b [command]
Available Commands:
command-b1 command description
command-b2 command description
command-b3 command description
Flags:
--kubeconfig string path to kubeconfig file
-h, --help help for cli-b
Use "cli-b [command] --help" for more information about a command.我现在要做的是,我希望CLI (及其所有子命令)是CLI的子命令,如下所示:
$ cli-a -h
Usage:
cli-a [command]
Available Commands:
command-a1 command description
command-a2 command description
command-a3 command description
cli-b description about cli-b
Flags:
--config string config file (default is $HOME/.cli-a.json)
-h, --help help for cli-a
Use "cli-a [command] --help" for more information about a command.因此,当用户运行$ cli-a cli-b -h时,他们会看到:
$ cli-a cli-b -h
Usage:
cli-a cli-b [command]
Available Commands:
command-b1 command description
command-b2 command description
command-b3 command description
Flags:
--kubeconfig string path to kubeconfig file
-h, --help help for cli-b
Use "cli-a cli-b [command] --help" for more information about a command.两个repos都位于不同的Go模块名称/存储库中。如果用户不喜欢下载和使用CLI中的所有功能,我仍然希望为用户提供CLI。
CLI的大部分工作(特性、bug修复等)将在CLI存储库中完成,我正在考虑将它们合并/合并到我的CLI的CI管道中(需要考虑如何做到这一点)。
如果可能的话,我不想每次更改CLI代码基(业务逻辑、CLI标志等)时都更改/更新CLI代码库中的任何内容。我希望CLI就像CLI的代理服务器一样(我在这里使用一个类推)--其中所有的业务逻辑都保存在CLI代码基中。
而且,如果仔细查看上面的示例输出,当用户运行$ cli-a cli-b -h或$ cli-a cli-b command-bN [-h]时,我不希望CLI的根标志(--config)出现并生效。相反,我希望CLI的根标志(--kubeconfig)出现并生效。
问题
我非常感谢这里的所有输入、指针、示例和外部资源。提前谢谢你。
发布于 2022-03-06 23:17:24
我已经做了类似的事情,您可以将两个cli作为不同的模块来维护,没有必要合并代码。
在CLI-A的root命令中所要做的就是
cliARootCommand.AddCommand(
cliBPackage.NewRootCommand(),
)对于问题的第二部分,CliA的持久性标志不是CliB的一部分。我们在CliB和CliB根命令的PreRunE中禁用标志解析,我们可以标记隐藏的所有父标志,然后解析这些标志。
func NewRootCommand() *cobra.Command {
rootCommand := &cobra.Command{
Use: "cli-b",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
// marking all parent flag hidden
cmd.Parent().Flags().VisitAll(
func(f *pflag.Flag) {
cmd.Flags().MarkHidden(f.Name)
},
)
// enabling flag parsing
cmd.DisableFlagParsing = false
if err := cmd.ParseFlags(args); err != nil {
return err
}
if cmd.Flag("help").Changed {
err := cmd.Help()
if err != nil {
return err
}
os.Exit(0)
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
return cmd.help()
},
}
//Diasbling flag parsing
rootCommand.DisableFlagParsing = true
return rootCommand
}https://stackoverflow.com/questions/67396348
复制相似问题