使标志仅在一个子命令中持久存在

问题描述 投票:0回答:1

构建自 go-Cobra PersistentFlags 和 Flags 之间有什么区别?:

假设我们有一个顶级

prog
命令,以及两个
start
stop
子命令。

假设

prog
命令有一个名为
database
的持久标志。

如何才能使此标志仅在

start
命令中必需? 请注意,
stop
命令应该具有该标志,但它应该是可选的。

progCmd.MarkPersistentFlagRequired("database")
无法按预期工作,因为它会使
start
stop
中都需要该标志。

startCmd.MarkPersistentFlagRequired("database")
也不起作用:

no such flag -database
go-cobra
1个回答
0
投票

这是按照您所描述的方式运行的最小示例。

总长:

您可能已将

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")

}

© www.soinside.com 2019 - 2024. All rights reserved.