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

Node.js 管理NodeJS配置标志的更好方法?,node.js,docker,configuration,flags,Node.js,Docker,Configuration,Flags,我有一个NodeJS应用程序,需要为其提供各种标志来定制环境 我已经在使用dotenv处理环境文件,并且正在从CLI将其预加载到应用程序中: “脚本”:{ “hello”:“DOTENV_CONFIG_PATH=/my/PATH/dev.env node--max_semi_space_size 64--inspect=0.0.0.0 dist/index.js” } 我的问题是:我开始遇到一种情况,在某些情况下我需要添加越来越多的nodejs标志——有更好的方法吗?我无法想象将来会将20个c

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

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

“脚本”:{
“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\u semi\u space\u size…
传递给节点

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

  • 将脚本逻辑移动到外部文件
  • 使用node+标志对node命令进行别名

  • 使用我的自定义设置重新编译节点最佳做法是创建一个可重用且可在多个级别上更改的机制。许多面向广泛使用的docker容器都采用这种方法

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

    ...
    ENV NODE_OPTIONS="--max_semi_space_size 64 --inspect=0.0.0.0"
    ...
    
  • 将该值设置为默认值
  • 检查配置文件中是否有新值,如果有,则覆盖该值
  • 检查是否有来自环境变量的新值,如果有,则覆盖该值
  • 检查启动标志中是否有新值,如果有,则覆盖该值
  • 此方法适用于
    节点CLI
    参数,但层次结构较浅且在环境变量设置时停止

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

    应用程序配置变量 Node.js有一个很好的库,名为
    nconf
    ,您可以在上找到。该库允许您进行分层配置。下面是一个简单的示例(取自库中的示例,经过空间修剪)

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

    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
    )来覆盖更改

    请注意,环境文件应采用shell格式FLAG=VALUE,而不是json格式

    节点CLI参数 节点CLI参数也可以用这种方法处理(唯一的区别是层次结构在CLI处停止)。容器应在Dockerfile中使用所需的标志定义
    Node\u 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文件
    来修改特定容器的文件。

    在我看来,package.json文件应该尽可能干净。 通常在这种情况下,我会创建
    scripts
    shell
    目录,然后将所有脚本放入单独的bash或shell文件中。最后,只需从npm命令调用这些文件

    大概是这样的:


    我不确定在这种情况下使用
    ncof
    是否是一个好选择。

    我认为这可以满足您的需要:

    节点\u选项=选项…

    以空格分隔的命令行选项列表

    ……除了:

    如果使用了环境中不允许的选项,Node.js将退出并出错

    允许的选项中未列出“最大半空间大小”,但您可以尝试

    但无论如何

    "scripts": {
      "hello": "./run_node_with_options.sh"
    }
    
    #使用_options.sh运行_节点
    DOTENV_CONFIG_PATH=/my/PATH/dev.env节点--最大空间大小64--检查=0.0.0.0 dist/index.js”
    

    似乎是一个更强大的解决方案。

    感谢您提供了详细的回答。如果您想设置环境变量,我认为这是一个很好的方法。但是-我不确定这是否适用于我介绍的情况,可能我不够清楚。我需要为节点本身设置CLI标志,我只是不想设置一个,长的命令使用大量的标志来实现这一点。我希望节点二进制文件的行为有所不同,这是通过标志设置的。对于环境变量(在docker中也是如此),这是一个很好的解决方案。这是一种通用的方法,也适用于CLI。对于
    节点
    CLI,环境变量称为
    节点_选项
    。我将更新此特殊情况的答案谢谢!我将在接下来的几天内尝试一下。OK,现在我明白了。谢谢,我相信由于您的回答,我将能够使我的配置灵活。基本上,我缺少NODE_OPTIONS变量甚至存在的事实……所以谢谢您!有一个好的NODE_OPTIONS,好的,所以它基本上将它移动到其他地方,在一个shel下在本例中为l脚本。正确地说,在您链接的答案推荐中,如果某人没有您编写脚本的shell,可能会很麻烦……我真的很惊讶,除了经典标志外,没有简单的方法来配置nodejs cli。到目前为止,我认为alias是我能想到的最接近的,但它不是可移植的莉莉,如果在docker外面的话。当我看到一个天秤座的时候
    NODE_OPTIONS='--require "./a.js"' node --require "./b.js"
    # is equivalent to:
    node --require "./a.js" --require "./b.js"
    
    "scripts": {
      "hello": "./run_node_with_options.sh"
    }