问题标签 [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.
windows - GO C 风格的控制台应用程序
我通过命令使用 cobra 框架创建了一个 Go CLI 应用程序cobra add
。go build
如果我在 Windows cmd 的存储库中,使用它构建它后完全可以正常工作。如果我单击,.exe
我会在终端上收到以下消息:
这不适合我的情况。我想要一个像 C 或 C++ 一样的控制台应用程序,它可以直接打开,你可以在那里输入命令。您对我在使用眼镜蛇时如何实现这一点有什么建议吗?
非常感谢您。
go - Cobra MarkPersistentFlagRequired 在 Root 上不起作用
使用 spf13/Cobra 进行 cli 标志解析。
root 命令有一个标记为必需的字段:
但是,如果它是 root 命令,cobra 不会引发错误。
如果我添加子命令并添加必填字段,如果命令行上未提供参数,.MarkFlagRequired 会按预期引发错误。
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 ,这里不是这种情况......我在这里错过了什么?
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
方法中,我是否应该做类似的事情
请告诉我。
谢谢
go - 将 grpc 客户端包装在 cobra 命令后面的正确方法是什么?
我正在使用 cobra 实现 GRPC 客户端。不同的服务调用在子命令后面。
为了避免代码重复,我在单例中保留了一个连接和一个客户端viper
。但我不确定这是正确的方法。
现在,在 中cmd/root.go::initConfig()
,我创建连接和客户端并保存它们。
连接关闭rootCmd.PersistentPostRun()
,在同一个root.go
文件中定义。
并且客户端是从viper
子命令的Run
文件中检索和使用的,例如,
此实现有效,但我不确定这是一个好习惯。具体来说
- 在一个函数中创建连接并在另一个函数中关闭它是不是很糟糕?
- 将客户端保存在其中是否有意义,
viper
或者在每个子命令的功能中创建一个新客户端是否更好Run
?
所有源代码都在这个 repo中
go - 标准输入测试的 Golang 模式
编辑:阿德里安的建议是有道理的,所以我将我的代码移动到一个函数中并从我的眼镜蛇块中调用该函数:
那么我可以将什么传递给这个方法来测试输出是否符合预期?
go - 如何仅提取在 cli 中明确设置的标志集?
我想知道是否有办法从 cli 中排除用户未设置的标志值。所以我的问题是,我的眼镜蛇cmd
中有一些具有默认值的可选标志。我想知道如果用户没有设置这些可选标志,是否有办法排除它们被处理?或者从另一个角度来看,有没有办法从标志集中提取用户从 cli 显式更改的标志cmd
?
这是一个更好地说明我的案例的示例:
因此,假设对于年龄和地址,我希望它们是可选的,并且在传递给 struct 时不传播。所以这意味着,在 cli 中,用户不需要提交age
andaddress
标志,这些可选标志的默认值为 nil。但是,Int 和 String 标志是强类型的,因此它们需要默认值(例如:""
和-1
)。结果,当我将命令 pflags 绑定到 viper 并且用户不在 cli 中输入年龄和地址值时,viper 将接收""
地址和-1
年龄。使用上述方法,默认值将传播到 User 结构。
我想要的是排除用户未设置的标志值。有没有办法让我从接收用户未明确设置的标志值中排除用户结构?
我目前排除未设置标志在 User 结构中处理的解决方案目前是这样的:
- 有一个命令标志数组。初始化一个空
map[string]interface{}
- 遍历数组,并检查标志是否通过
flags.Changed("flag")
. 如果标志被更改,则将其添加到地图 - 将地图转换为 json
将 json 对象解组为结构
/li>
但我想知道是否有比我上面的解决方案更好的选择。最好,我不想更改User
结构中的任何内容,因为它是从外部包导入的。
谢谢你。非常感谢您的帮助。
go - 对于 cobra 应用程序,*sqlx.DB 对象应该保存在哪里?
我有一个使用包访问数据库的眼镜蛇项目sqlx
,该命令具有子命令。cobra 相关代码在cmd
文件夹/子包中,DB 相关代码在db
文件夹/子包中。
我想有包 db 有一个工厂功能
从cmd
包的某个地方调用。但我不确定在哪里调用它以及如何使其可用于所有子命令。
一种想法是在包中有一个全局变量,并在's或'scmd
中对其进行初始化。在这种情况下使用全局变量是否不好?root.go
init()
rootCmd
PersistentPreRun
如果我不使用全局变量,一种可能性是让子命令调用db.NewDB()
. 不知何故,这种方式也感觉不太好。
db.NewDB()
我发现在包中调用一次更好cmd
,可能在root.go
. 但是我应该在哪里保存数据库句柄以便子命令可以使用它?
go - Cobra 更改帮助模板中的使用行
我希望能够设置该Usage
行以指定如果在 Go 中的 cobra 命令上调用帮助函数时需要传递一个参数。
这是常规帮助标志输出的内容:
我想:
我曾尝试SetUsageTemplate
在init()
函数中使用,但随后它删除了部分标志:
这导致:
我在哪里丢失了-h
标志和有关Global Flags
.
如果他们不提供 arg,我可以通过以下方式使其工作:
但随后-h
标志仍然输出错误的使用行。
有没有办法做到这一点?提前致谢!
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/服务器示例,那里有很多这样的示例。