@ekino/ 配置
一个由Yaml提供动力的轻量级/倾斜型/横向配置模块.
动机
为什么另一个Node.js配置包?
这是我们在开始这个模块前 问自己一个问题, 我们想要简单的配置管理 具有以下特性:
- 简单使用
- 小脚印
- 同质配置文件格式
- 没有全局/ 特定/ 前配置模块可以装入( 例如需要 lib, 配置它, 然后直接使用软件包 )
- 人类可读性
- 简洁
- 评论
- 类型
- 覆盖
- 信封变量支持
有几个模块已经存在,但是没有一个模块符合我们的要求, 有些过于有限,而另一些则在我们看来非常膨胀.
我们选择了Yaml 因为它会自动满足几个要求, 它比起json简洁,你可以添加注释,它支持类型 读起来非常容易 Yaml还提供其他精致的功能 例如 锚。 。 。 .
我们只支持 Yaml 配置文件,有一个项目与 json, (中文(简体) ), xml, (中文(简体) ),
toml, (中文(简体) ), ini, (中文(简体) ), properties,只是没有规模 当工作大的项目,
每个人添加它最喜欢的口味.
然后我们用环境变量来加载 覆盖或定义一些特定的密钥, 很容易根据环境来调整你的配置 你跑不动 单行代码甚至配置文件. 严重使用多克时真的很方便.
我们用这个代码跨过几个项目(一个小文件,目前由~100 loc组成), 并在需要时加以改进.
我们到了! 它现在开源 我们希望它能帮助别人 像它为我们所做的那样 造出令人惊叹的东西.
安装
使用 pnpm : pnpm add @ekino/config
或npm: (中文(简体) ) npm install @ekino/config
巨钩
此软件包通过设置来配置寄存器的本地 Git 钩 :
core.hooksPath = ./.githooks
在安装过程中会自动做到这一点,以确保为贡献者持续启用Git钩.
使用量
由于这个模块非常依赖 环境变量你可以读 这个 如果你对她们不满意的话.
默认情况下,本模块假设配置文件位于您当前工作目录的根( Q)process.cwd()) (中文(简体) ).
然而,您可以用相对路径或绝对路径在其它任何地方加载文件 :
├─ conf/
├─ base.yaml # the base configuration
├─ env_mapping.yaml # defines mapping between env vars and config keys
└─ dev.yaml # Optional file loaded if CONF_FILES includes `dev`
base.yaml 它定义了您应用程序的共同基本配置.
然后在代码中获取一个配置密钥值 :
# /conf/base.yaml
host: base.config.io
external_api:
key: xxxxx
// test.js
const config = require('@ekino/config')
console.log(config.get('host'))
console.log(config.get('external_api.key'))
如果我们运行这个剧本,我们将有:
node test.js
> base.config.io
> xxxxx
环境变量覆盖
有时您想要在特定环境中覆盖一个单一的值, 因此本模块提供
一个特殊文件,名为 env_mapping.yaml,它允许根据
环境可变值.
假设有以下配置文件:
# /conf/base.yaml
host: base.config.io
external_api:
key: xxxxx
# /conf/env_mapping.yaml
HOST: host
API_KEY: external_api.key
和以下代码:
// test.js
const config = require('@ekino/config')
console.log(config.get('host'))
console.log(config.get('external_api.key'))
如果我们运行这个剧本,我们将有:
node test.js
> base.config.io
> xxxxx
HOST=staging.config.io API_KEY=12345 node test.js
> staging.config.io
> 12345
第二次运行输出了不同的值,因为我们绘制了 HOST 财务报告和审定财务报表 API_KEY 环境变量
页:1 host 财务报告和审定财务报表 external_api.key 使用配置密钥 env_mapping.yaml。 。 。 .
环境变量可能很方便,但是当从节点读到它们时, 我们总是会得到一个字符串, 例如,在处理布尔值时,这可能很烦人. 因此,可以选择性地强制集合环境变量值的类型:
# /conf/env_mapping.yaml
PORT:
key: port
type: number
USE_SSL:
key: use_ssl
type: boolean
TAGS:
key: tags
type: array
我们支持 number, (中文(简体) ), boolean 财务报告和审定财务报表 array 类型.
对于 array 类型,环境可变值应为逗号分隔字符串:
TAGS="foo,bar,fizz,buzz" 将被投给 ['foo', 'bar', 'fizz', 'buzz']。 。 。 .
CONF FILES 覆盖
如果你有一堆变化 取决于环境 你运行你的应用,
定义其中的数十个地图可能很麻烦 env_mapping.yaml 文档.
此模块赋予您根据 CONF_FILES
环境可变值。 文件在 CONF_FILES 以同样的顺序装入,
这样 CONF_FILES=google,extra,它会装入 /conf/google.yaml,则 /conf/extra.yaml。 。 。 .
文件路径既可以是相对的(与CONF DIR Direct),也可以是绝对的.
假设我们有这些配置文件:
# /conf/base.yaml
service: awesome
host: base.config.io
port: 8080
# /conf/prod.yaml
host: prod.config.io
port: 8081
# /conf/aws.yaml
host: prod.aws.config.io
# /conf/google.yaml
host: prod.google.config.io
# /conf/extra.yaml
port: 8082
和以下代码:
// test.js
const config = require('@ekino/config')
console.log(config.get('service'))
console.log(config.get('host'))
console.log(config.get('port'))
如果我们运行这个剧本,我们将有:
node test.js
> awesome # from base.yaml
> base.config.io # from base.yaml
> 8080 # from base.yaml
CONF_FILES=prod node test.js
> awesome # from base.yaml
> prod.config.io # from prod.yaml
> 8081 # from prod.yaml
CONF_FILES=prod,aws node test.js
> awesome # from base.yaml
> prod.aws.config.io # from aws.yaml
> 8081 # from prod.yaml
CONF_FILES=prod,google node test.js
> awesome # from base.yaml
> prod.google.config.io # from google.yaml
> 8081 # from prod.yaml
CONF_FILES=prod,google,extra node test.js
> awesome # from base.yaml
> prod.google.config.io # from google.yaml
> 8082 # from extra.yaml
:警告: env_mapping.yaml 将永远优先于文件覆盖.
继承模式
base.yaml <— [<CONF_FILES>.yaml] <— [env_mapping.yaml]
所有文件被包围 [] 是可选的.
- 装入配置从
<CONF_DIR>/base.yaml - 若为
CONF_FILES定义,如果每个对应文件存在,则加载 - 若为
<CONF_DIR>/env_mapping.yaml已存在, 并且一些环境变量匹配, 覆盖这些值