子命令继承
在Cobra中,子命令可以从其父命令继承Flags。这意味着可以在最高级的命令行应用程序中定义全局标志,并在多个命令之间共享这些Flags。
例如,在 root根命令(通常是 cmd/root.go
)中,你可以定义一个全局的 --verbose
标志:
var verbose bool
func init() {
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output")
}
使用 PersistentFlags
而非 Flags
可以让 --verbose
标志在所有子命令中都可用。
自定义帮助文档
Cobra 默认会为每个命令生成一个基础的帮助文档,也可以自定义这些文档。
在命令的定义中,可以设置 Long
和 Example
字段来提供更详细的帮助信息和使用示例。
var cmd = &cobra.Command{
Use: "mycommand",
Short: "This is my custom command",
Long: `This is a longer description that spans multiple lines.
You can add as much text as you like.`,
Example: "mycommand --flag value",
// ...
}
自动生成补全脚本
一个强大的命令行工具通常会包括自动补全功能。Cobra 能生成用于 Bash、Zsh、Fish 和 PowerShell 的自动补全脚本。
如要生成 Bash 补全脚本,你可以使用以下命令:
mycli completion bash > /etc/bash_completion.d/mycli
测试
使用Go的内建测试框架来测试 Cobra 命令
func TestMyCommand(t *testing.T) {
// Initialize Cobra command
cmd := &cobra.Command{
// ...
}
// Execute command and capture the output
output, err := executeCommand(cmd, "arg1", "arg2")
// Perform assertions
}
总结
在这篇文章中,我们探讨了 Cobra 的一些高级特性和最佳实践,包括子命令继承、自定义帮助文档、自动补全和测试。
通过利用这些高级特性,将能够创建功能完善且易于维护和扩展的命令行应用程序。