【问题标题】:How to pass parameters from command objects如何从命令对象传递参数
【发布时间】:2018-04-23 11:37:18
【问题描述】:

我使用以下代码需要从函数root, value传递值

var cfBuild = &cobra.Command{
    Use:   "build",
    Short: "Build",
    Run: func(cmd *cobra.Command, args []string) {


        root, value := Build(target)
    },
    PersistentPostRun: func(cmd *cobra.Command, args []string) {
   //Here I need to use root, value
   } 
}

我可以通过使用全局变量来做到这一点,但是在这种情况下有没有一种避免全局的好方法?

这是repo,我没有找到任何好的方法... https://github.com/spf13/cobra

顺便说一句,可以选择使用viper

喜欢...

Run: func(cmd *cobra.Command, args []string) {
    root, value := Build(target)
    viper.Set("root", root)
    viper.Set("value", value)

然后在其他方法中获取它... 方向好吗?

【问题讨论】:

  • 如果我理解正确,那么这个答案是完全相同的问题; stackoverflow.com/a/49981932/6376471
  • @Zak ,你回答我的问题 :) 使用 env( 不同的方法,这里是毒蛇在你的回答是 terraform.io/docs/state ,不是类似的方法吗?如果不是为什么?
  • viper.Set(...) 不会在同一程序的执行之间持续存在。文档 (godoc.org/github.com/spf13/viper#Set) 说 viper 会将设置的值存储在其内部寄存器中,这意味着它会在程序结束后丢失。假设在您的情况下程序不会在 RunPersistentPostRun 之间退出,那么您可以使用 viper。如果 PersistentPostRun 作为另一个 CLI 工具执行,则 viper.Set(...) 中的值将丢失。
  • @Zak - 您的解决方案提案有一些示例代码,我的上下文中有一些 oss 示例吗?如果是,请将其作为答案提供,第二个问题的链接对我的情况没有多大帮助....

标签: go


【解决方案1】:

您不需要 Viper。 只需创建 2 个单例(在命令文件中具有全局范围的变量),您就可以将它们分配给您的 Build 函数返回。

例子

package cmd

var (
    root,
    value string
)

var cfBuild = &cobra.Command{
    Use:   "build",
    Short: "Build",
    Run: func(cmd *cobra.Command, args []string) {
        root, value = Build(target)
    },
    PersistentPostRun: func(cmd *cobra.Command, args []string) {
        fmt.Printf("%s, %s", root, value)
   } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多