构建自 go-Cobra PersistentFlags 和 Flags 之间有什么区别?:
假设我们有一个顶级
prog
命令,以及两个 start
和 stop
子命令。
假设
prog
命令有一个名为 database
的持久标志。
如何才能使此标志仅在
start
命令中必需? 请注意,stop
命令应该具有该标志,但它应该是可选的。
progCmd.MarkPersistentFlagRequired("database")
无法按预期工作,因为它会使 start
和 stop
中都需要该标志。
startCmd.MarkPersistentFlagRequired("database")
也不起作用:
no such flag -database
这是按照您所描述的方式运行的最小示例。
总长:
您可能已将
PersistentFlags
附加到根命令 prog
,其中 start
和 stop
是子命令,因此根据定义持续存在。
标志可以是“持久的”,这意味着该标志将可用于分配给它的命令以及该命令下的每个命令。对于全局标志,将标志分配为根上的持久标志。
在下面的示例中,为每个
PersistenFlags()
和 Flags()
子命令设置 start
或 stop
,并分别为每个所需标志应用 MarkPersistentFlagRequired()
或 MarkFlagRequired()
。
文件布局示例
├── cmd
│ ├── root.go
│ ├── start.go
│ └── stop.go
├── go.mod
├── go.sum
├── main.go
main.go
package main
import (
"stackoverflow/78807651/prog/cmd"
)
func main() {
cmd.Execute()
}
cmd/root.go
package cmd
import (
"github.com/spf13/cobra"
)
var RootCmd = &cobra.Command{
Use: "prog",
}
func Execute() {
RootCmd.Execute()
}
cmd/start.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var startCmd = &cobra.Command{
Use: "start",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("starting...")
},
}
func init() {
RootCmd.AddCommand(startCmd)
// startCmd.Flags().StringP("database", "d", "", "testdb")
// startCmd.MarkFlagRequired("database")
startCmd.PersistentFlags().StringP("database", "d", "", "testdb")
startCmd.MarkPersistentFlagRequired("database")
}
cmd/stop.go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var stopCmd = &cobra.Command{
Use: "stop",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("stopped...")
},
}
func init() {
RootCmd.AddCommand(stopCmd)
// stopCmd.Flags().StringP("database", "d", "", "testdb")
// stopCmd.MarkFlagRequired("database")
stopCmd.PersistentFlags().StringP("database", "d", "", "testdb")
// stopCmd.MarkPersistentFlagRequired("database")
}