载入外部配置数据
tiny3 Example
在本节中,通过引入 hedzr/cmdr-loaders,将会采用一个较为冗长的示例程序来展示如何逐步地整合配置管理并加载外部配置文件的能力。
下面的示例程序是一个较为冗长的版本,
一个全面的基础骨架示例程序可以在 cmdr-tests/blueprint 找到。
在 hedzr/cmdr-tests
的根目录中包含一个名为 tiny3-app.toml
的配置数据文件:
它将被 tiny3 在执行时装入。我们可以借助于 --full
打印的配置数据树观察到这个功能是正常工作的:
注意到高亮行显示了 app.tiny3.foo
的键值被正确加载了。
自动搜索配置文件夹
hedzr/cmdr-loaders 提供符合 GNU Folder Spec, UNIX Filesystem Conventions (wiki) 以及 Filesystem Hierarchy Standard (wiki)。
因此,cmdr & cmdr-loaders 将会自动搜索诸如
Primary
:/etc/<app-name>
Secondary
:$HOME/.config/<app-name>
Alternative(s)
:.
and<exeutable-dir>
这些文件夹来查找 <app-name>.toml
是否存在。
如果找到了(例如本例中的 tiny3-app.toml
),那就载入其中的数据集。
然后,如果这是 Primary
和 Secondary
配置集,那就检查该文件夹中是否有 conf.d
子文件夹,
如果有,自动装载这个子文件夹中的全部配置文件。
hedzr/cmdr-loaders
识别多种文件名后缀并正确装载它们,包括:
- .toml
- .yaml, .yml
- .json
- .hjson
- .hcl
- .nestedtext, .txt, .conf
你甚至可以同时混用它们。
后续章节会建议你使用 cmdr-loaders/lite 版本,该版本仅仅集成了 TOML 第三方库,依赖相对较少。
自动回写变更集合
对于 Alternative
配置集,我们还支持自动回写的功能:当应用程序结束时,自动将内存中的配置数据集的变更条目写入到 Alternative 配置文件中。
默认地,仅有当前工作目录中的 <app-name>.{toml,yaml,...}
才属于 Alternative
配置集,它才支持自动回写功能。
注意:<exeutable-dir>
的 Alternative 配置文件不支持回写功能。
自动环境变量绑定
当使用 local.NewEnvVarLoader()
这个 loader 时,它将会处理自动环境变量到命令行选项参数的绑定。
所谓自动环境变量,是指 APP_xxx
这样的环境变量名字。
如果自动绑定功能启用,那么像 APP_JUMP_FULL=1
这样的环境变量值会被
赋予 jump
命令的 full
参数选项,从而起到 app jump --full to
这个命令行的等价效果,对应的命令行可以是 APP_JUMP_FULL=1 app jump to
。
那么孰优孰劣呢?这就很难讲了,负责 DevOps 的人或许会有自己的看法。
没有启用时怎么办
通常情况下,你可以为一个参数选项显式地做环境变量绑定,如同这样:
所以你也可以不必启用自动环境变量的绑定能力。
错误返回
wrong
子命令给出了一个示范,你可以正常地返回 err,它将被逐级向上递交到 main()
函数中,在那里会打印该错误信息以便提醒终端用户问题之所在。
如果程序被运行在调试模式(命令行标志 --debug
激活该模式,is.DebugMode()
在程序中检测之),那么错误信息还包含堆栈信息。
如果抛出错误的地点没有将上下文堆栈信息封装进去,那么这里仍然不会打印堆栈信息。
对于第三方库抛出的错误没有堆栈信息的情况,较好的解决方法是在你的错误返回语句处对其使用 hedzr/errors
封装一下。例如下面的代码片段处理了 go-git/v5 的错误,将其再封装了堆栈信息以供调试。
hedzr/errors.v3
理论上兼容 go1.11 - latest 的全部版本,并提供统一和一致且兼容 go1.13 errors 的操作界面。通常你可以平滑地从 "errors" 官方包直接切换为 hedzr/errors.v3
。
使用 hedzr/errors.v3
的收益在于:
errors.New(format, args...)
能够以多种方式格式化消息或添加上下文对象;- 支持嵌套下级错误对象 / 错误容器
var ec = errors.New(); ec.Attach(err)
- 自动收集上下文堆栈信息
- 一些增强的特性
使用 Lite 版本
如同文章开始的示例程序,通常我们建议你使用 hedzr/cmdr-loaders 的 Lite 版本来加载配置文件。 它提供了一个轻量级的配置文件加载器,引入的方法是:
而相对应的,标准版本则是:
两者的区别只在于 Lite 版本仅仅支持 TOML 和 JSON 文件格式的识别,从而仅引入了到第三方 TOML 解析器的外部依赖,相应的标准版本则带有大量的第三方文件格式解析器的依赖。
内置的 jsonLoader
事实上 cmdr.v2
内置了一个超级微型的 json loader,所以即使你没有通过 hedzr/cmdr-loaders
来搜索外部配置文件和加载它们,也仍然能够至少载入一个 JSON 格式的配置文件。
这个 jsonLoader
将会尝试载入当前目录下的 .<app>.json
或者 <app>.json
配置文件。以 examples/tiny/lite
app 为例,它将会尝试加载 lite-app.json
,其参考内容如下:
加载后相应的子项为:
之所以是 JSON 格式而非 TOML 或者其他,这是因为如此我们才能避免在 cmdr.v2 core 中引入额外的第三方包作为依赖。
实际上你完全可以借助于 hedzr/store
所提供的 providers 以及 codecs,自行实现 hedzr/cmdr-loaders
中所包含的全部功能。
:end:
How is this guide?
Last updated on