3. 启动工具 Cobra
3.1 k8s使用示例
k8s启动的时候使用cobra进行构建,例如apiserver的启动流程为:
func main() {
command := app.NewAPIServerCommand() // command类型为cobra.Command
code := cli.Run(command)
os.Exit(code)
}
基本所有的组件启动流程都是一致的,先读取命令行参数,组装成cobra.Command,然后再使用cli.Run跑起来。
启动大体流程如下:
图1. 启动流程
3.2 Cobra
Cobra 是一个用于构建命令行应用程序的库,它简单易用,支持子命令、标志等多种功能,非常适合构建命令行工具。
主要特点:
-
子命令支持:Cobra 支持多级子命令,可以轻松构建复杂的命令行工具。例如,
git命令有git add、git commit、git push等多个子命令。 -
标志(Flags)支持:Cobra 支持全局标志和局部标志,可以灵活地定义命令行参数。例如,
--help和-v等标志。 -
自动补全:Cobra 支持自动生成 shell 补全脚本,支持 bash、zsh、fish 和 PowerShell 等多种 shell。
-
命令别名:支持命令别名,用户可以为命令定义简短的别名,提高使用便利性。
3.2.1 读取命令行参数
执行cli.Run之后最后会执行到cobra.Command的Execute方法,其中使用os.Args读取命令行参数:
// ExecuteC executes the command.
func (c *Command) ExecuteC() (cmd *Command, err error) {
...
args := c.args
// Workaround FAIL with "go test -v" or "cobra.test -test.v", see #155
// 使用 os.Args 读取命令行参数
if c.args == nil && filepath.Base(os.Args[0]) != "cobra.test" {
args = os.Args[1:]
}
// initialize the hidden command to be used for shell completion
c.initCompleteCmd(args)
...
return cmd, err
}