复杂的命令行界面

一些程序希望为用户提供丰富的命令行界面,包括子命令。例如,kubectl createkubectl run,以及许多其他的子命令都是由程序kubectl提供。至少有以下常用的库可以实现这个目的。

如果你没有偏好或者其他考虑因素相同,推荐使用subcommands,因为它是最简单的,而且容易正确使用。然而,如果你需要它所不提供的不同功能,请挑选其他选项之一。

  • cobra
    • 习惯标志:getopt
    • 在谷歌代码库之外很常见。
    • 许多额外的功能。
    • 使用中的陷阱(见下文)。
  • subcommands
    • 习惯标志:Go
    • 简单且易于正确使用。
    • 如果你不需要额外的功能,推荐使用。

警告:cobra 命令函数应该使用 cmd.Context() 来获取上下文,而不是用 context.Background 来创建自己的根上下文。使用子命令包的代码已经将正确的上下文作为一个函数参数接收。

你不需要把每个子命令放在一个单独的包中,而且通常也没有必要这样做。应用与任何 Go 代码库相同的关于包边界的考虑。如果你的代码既可以作为库也可以作为二进制文件使用,通常将 CLI 代码和库分开是有好处的,使 CLI 只是其客户端中的一个。(这不是专门针对有子命令的CLI的,但在此提及,因为它经常出现。)