问题标签 [go-cobra]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
310 浏览

windows - GO C 风格的控制台应用程序

我通过命令使用 cobra 框架创建了一个 Go CLI 应用程序cobra addgo build如果我在 Windows cmd 的存储库中,使用它构建它后完全可以正常工作。如果我单击,.exe我会在终端上收到以下消息:

这不适合我的情况。我想要一个像 C 或 C++ 一样的控制台应用程序,它可以直接打开,你可以在那里输入命令。您对我在使用眼镜蛇时如何实现这一点有什么建议吗?

非常感谢您。

0 投票
1 回答
1034 浏览

go - Cobra MarkPersistentFlagRequired 在 Root 上不起作用

使用 spf13/Cobra 进行 cli 标志解析。

root 命令有一个标记为必需的字段:

但是,如果它是 root 命令,cobra 不会引发错误。

如果我添加子命令并添加必填字段,如果命令行上未提供参数,.MarkFlagRequired 会按预期引发错误。

0 投票
1 回答
1165 浏览

go - GO:使用错误的参数运行 cli 命令

我使用 cobra 创建 CLI 命令工具。除了错误处理,一切看起来都很好

如果错误发送命令(错误的参数或错误的输入),我想要什么返回std.err而不是std.out

为了简化我创建的演示我的用例的secnario

现在,如果我编译二进制文件并exec.Command针对二进制文件运行,一切都会按预期工作。但是如果我想测试错误场景,就像mycli provide apps apps1 我想看到返回的std.err而不是std.out

当我执行mycli provide apps myapp一切都应该没问题

但是如果我跑步,mycli provide apps myapp2我想得到 std.err 而不是 std.out ,这里不是这种情况......我在这里错过了什么?

https://play.golang.org/p/B00z4eZ7Sj-

0 投票
1 回答
737 浏览

go - 如何让每个眼镜蛇命令解析自己的标志?获取初始化循环(预期,但如何避免?)

我正在遵循https://github.com/spf13/cobra#flags上的指南,但我对那里的一些内容感到困惑。

我有一些服务(rest api、电子邮件服务、事件),我正在尝试做这样的事情:

go run *.go rest -env DEV -p 3000

go run *.go events -env DEV -p 3001

我正在关注 github 页面,所以我已经这样定义了我的 rootCmd 和 restCmd:

runRest方法中,我是否应该做类似的事情

请告诉我。

谢谢

0 投票
0 回答
327 浏览

go - 将 grpc 客户端包装在 cobra 命令后面的正确方法是什么?

我正在使用 cobra 实现 GRPC 客户端。不同的服务调用在子命令后面。

为了避免代码重复,我在单例中保留了一个连接和一个客户端viper。但我不确定这是正确的方法。

现在,在 中cmd/root.go::initConfig(),我创建连接和客户端并保存它们。

连接关闭rootCmd.PersistentPostRun(),在同一个root.go文件中定义。

并且客户端是从viper子命令的Run文件中检索和使用的,例如,

此实现有效,但我不确定这是一个好习惯。具体来说

  1. 在一个函数中创建连接并在另一个函数中关闭它是不是很糟糕?
  2. 将客户端保存在其中是否有意义,viper或者在每个子命令的功能中创建一个新客户端是否更好Run

所有源代码都在这个 repo中

0 投票
2 回答
1264 浏览

go - 标准输入测试的 Golang 模式

编辑:阿德里安的建议是有道理的,所以我将我的代码移动到一个函数中并从我的眼镜蛇块中调用该函数:

那么我可以将什么传递给这个方法来测试输出是否符合预期?

0 投票
1 回答
1639 浏览

go - 如何仅提取在 cli 中明确设置的标志集?

我是眼镜蛇毒蛇的新手。

我想知道是否有办法从 cli 中排除用户未设置的标志值。所以我的问题是,我的眼镜蛇cmd中有一些具有默认值的可选标志。我想知道如果用户没有设置这些可选标志,是否有办法排除它们被处理?或者从另一个角度来看,有没有办法从标志集中提取用户从 cli 显式更改的标志cmd

这是一个更好地说明我的案例的示例:

因此,假设对于年龄和地址,我希望它们是可选的,并且在传递给 struct 时不传播。所以这意味着,在 cli 中,用户不需要提交ageandaddress标志,这些可选标志的默认值为 nil。但是,Int 和 String 标志是强类型的,因此它们需要默认值(例如:""-1)。结果,当我将命令 pflags 绑定到 viper 并且用户不在 cli 中输入年龄和地址值时,viper 将接收""地址和-1年龄。使用上述方法,默认值将传播到 User 结构。

我想要的是排除用户未设置的标志值。有没有办法让我从接收用户未明确设置的标志值中排除用户结构?

我目前排除未设置标志在 User 结构中处理的解决方案目前是这样的:

  1. 有一个命令标志数组。初始化一个空map[string]interface{}
  2. 遍历数组,并检查标志是否通过flags.Changed("flag"). 如果标志被更改,则将其添加到地图
  3. 将地图转换为 json
  4. 将 json 对象解组为结构

    /li>

但我想知道是否有比我上面的解决方案更好的选择。最好,我不想更改User结构中的任何内容,因为它是从外部包导入的。

谢谢你。非常感谢您的帮助。

0 投票
0 回答
190 浏览

go - 对于 cobra 应用程序,*sqlx.DB 对象应该保存在哪里?

我有一个使用包访问数据库的眼镜蛇项目sqlx,该命令具有子命令。cobra 相关代码在cmd文件夹/子包中,DB 相关代码在db文件夹/子包中。

我想有包 db 有一个工厂功能

cmd包的某个地方调用。但我不确定在哪里调用它以及如何使其可用于所有子命令。

一种想法是在包中有一个全局变量,并在's或'scmd中对其进行初始化。在这种情况下使用全局变量是否不好?root.goinit()rootCmdPersistentPreRun

如果我不使用全局变量,一种可能性是让子命令调用db.NewDB(). 不知何故,这种方式也感觉不太好。

db.NewDB()我发现在包中调用一次更好cmd,可能在root.go. 但是我应该在哪里保存数据库句柄以便子命令可以使用它?

0 投票
1 回答
1954 浏览

go - Cobra 更改帮助模板中的使用行

我希望能够设置该Usage行以指定如果在 Go 中的 cobra 命令上调用帮助函数时需要传递一个参数。

这是常规帮助标志输出的内容:

我想:

我曾尝试SetUsageTemplateinit()函数中使用,但随后它删除了部分标志:

这导致:

我在哪里丢失了-h标志和有关Global Flags.

如果他们不提供 arg,我可以通过以下方式使其工作:

但随后-h标志仍然输出错误的使用行。

有没有办法做到这一点?提前致谢!

0 投票
4 回答
3732 浏览

amazon-web-services - API Gateway HTTP 客户端请求与 IAM 身份验证与 Go

您好 StackOverflow AWS Gophers,

我正在使用spf13中出色的 cobra/viper 软件包实现 CLI 。我们有一个 Athena 数据库,前面有一个 API Gateway 端点,它通过 IAM 进行身份验证。

也就是说,为了使用 Postman 与其端点交互,我必须定义AWS Signature为 Authorization 方法,定义相应的 AWS id/secret,然后在 Headers 中会有X-Amz-Security-Token和其他。没有什么不寻常的,按预期工作。

由于我是 Go 新手,我有点震惊地看到没有使用aws-sdk-go自身执行此简单 HTTP GET 请求的示例......我正在尝试使用共享凭据提供程序(~/.aws/credentials),如来自 re:Invent 2015 的S3 客户端Go 代码片段

我怎样才能在 2019 年完成这个看似简单的壮举,而不必求助于自己做的net/http,因此不得不手动阅读~/.aws/credentials或更糟糕的是,使用os.Getenv和其他丑陋的 hack?

任何作为客户端交互的 Go 代码示例 都会非常有帮助。请不要使用 Golang Lambda/服务器示例,那里有很多这样的示例。