gpt4 book ai didi

node.js - 管理 NodeJS 配置标志的更好方法?

转载 作者:行者123 更新时间:2023-12-02 18:55:31 24 4
gpt4 key购买 nike

我有一个 NodeJS 应用程序,我需要为其提供各种标志来自定义环境。

我已经使用 dotenv 处理环境文件,并且也将其从 CLI 预加载到应用程序中:

"scripts": {
"hello": "DOTENV_CONFIG_PATH=/my/path/dev.env node --max_semi_space_size 64 --inspect=0.0.0.0 dist/index.js"
}

我的问题是:我开始遇到这样的情况:在某些情况下我需要添加越来越多的 Nodejs 标志 - 有没有更好的方法来做到这一点?我无法想象将来传递 20 个 cli 参数(即 --max_semi_space_size ... 到 Node 。

我想到/听说过的一些选项是:

  • 将脚本逻辑移至外部文件
  • 使用 Node + 标志为 Node 命令别名
  • 使用我的自定义设置重新编译 Node 😱

但这感觉很奇怪 - 我确信有一种方法可以处理不那么棘手的问题。你会如何解决这个问题?我也在使用 docker,如果这对你的建议有任何影响的话。

他!

最佳答案

最佳实践是创建一个可重用且可以在多个级别上更改的机制。许多旨在广泛使用的 docker 容器都遵循这种方法。

分层配置

模块需要支持分层配置。这意味着将有不止一种方法来设置变量,并且将有一个严格的层次结构,基于优先级,哪个值将是最终值。层次结构的最佳实践如下:

  1. 将值设置为默认值
  2. 检查配置文件中是否有新值,如果有则覆盖该值
  3. 检查环境变量中是否有新值,如果有则覆盖该值
  4. 检查启动标志中是否有新值,如果有则覆盖该值。

此方法适用于 node CLI 参数,但层次结构较浅并在环境变量设置处停止。

经过这一系列检查后,您将获得变量的最终值。

应用程序配置变量

Node.js 有一个名为 nconf 的优秀库,您可以在 github 上找到它。 。该库允许您进行分层配置。这是一个简单的示例(取自库中的示例,修剪了空间)

var nconf = require('nconf');

// 1. any overrides
nconf.overrides({
'always': 'be this value'
});

// 2. `process.env`
// 3. `process.argv`
nconf.env().argv();

// 4. Values in `config.json`
nconf.file('/path/to/config.json');

// 5. Any default values
nconf.defaults({
'if nothing else': 'use this value'
});

将其包装在您自己的模块中,并添加处理配置所需的附加逻辑

var myConfig = require('nconf');
..
...
..
module.exports = myConfig;

然后使用代码中的配置,如下所示

var config = require('./myConfig');
config.get('hello');

这将允许您在镜像中设置默认配置并在后续镜像中覆盖它们。下面是一个示例,第一个镜像 base 将在构建期间从文件设置 hello 标志,第二个镜像将使用 ENV 来覆盖设置:

FROM debian:latest as base

COPY ./hello_config.json /path/to/config.json
...
...

FROM base AS second

ENV hello="Hello world from second image!"
...
...

现在,当您创建容器时,您可以通过传递新环境文件 (--env-file) 或单个标志 (-e--env)

docker run --env hello="Hi from container!" --env-file ./new_conf.list secod

Note that the environment file should be in a shell format FLAG=VALUE and not in json format.

Node CLI 参数

Node CLI 参数也可以用这种方法处理(唯一的区别是层次结构在 CLI 处停止)。容器应在 Dockerfile 中使用所需标志定义 NODE_OPTIONS 环境变量,如下所示:

...
ENV NODE_OPTIONS="--max_semi_space_size 64 --inspect=0.0.0.0"
...

可以增强它以接受构建选项以及逐渐构建变量

...
ARG NODE_OPTIONS=""
ENV NODE_OPTIONS="${NODE_OPTIONS} --max_semi_space_size 64"
ENV NODE_OPTIONS="${NODE_OPTIONS} --inspect=0.0.0.0"
...

现在,在构建过程中我们可以指定其他选项,如下所示

docker build --build-arg NODE_OPTIONS="--cpu-prof --heapsnapshot-near-heap-limit=3" .

与应用程序配置相同,您可以使用 -env--env-file 文件针对特定容器进行修改。

关于node.js - 管理 NodeJS 配置标志的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66207752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com