【问题标题】:How to define an environment variable that can be automatically used in multiple npm scripts?如何定义一个可以在多个 npm 脚本中自动使用的环境变量?
【发布时间】:2019-12-02 07:02:27
【问题描述】:

考虑以下 npm 脚本。

$ npm run
available via `npm run-script`:
  make
    OUTPUT=dist/main.js bash -c 'elm make src/Main.js --output=$0 $1'
  make:dev
    npm run make -- '$OUTPUT' --debug
  make:prod
    npm run make -- '>(npm run uglify -- $OUTPUT)' --optimize
  uglify
    uglifyjs --compress 'pure_funcs="F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9",pure_getters,keep_fargs=false,unsafe_comps,unsafe' | uglifyjs --mangle --output=

我想按如下方式使用它:

$ npm run make -- '$OUTPUT' '--debug'


> experiment@0.1.0 experiment /Users/Adit/experiment
> OUTPUT=dist/main.js bash -c 'elm make src/Main.js --output=$0 $1' '$OUTPUT' '--debug'

这将正确创建 Elm 应用程序的调试版本。然而,事实并非如此。 npm run 不使用单引号,而是使用双引号:

$ npm run make -- '$OUTPUT' '--debug'


> experiment@0.1.0 experiment /Users/Adit/experiment
> OUTPUT=dist/main.js bash -c 'elm make src/Main.js --output=$0 $1' "$OUTPUT" "--debug"

因此,输出不是我所期望的。在不编写自定义 shell 脚本的情况下解决此问题的最佳方法是什么?我想在两个不同的命令中使用 OUTPUT 变量。但是,我只想在一个地方定义它。

【问题讨论】:

    标签: bash shell npm npm-scripts process-substitution


    【解决方案1】:

    我解决了如下问题。

    {
        "config": {
            "input": "src/Main.elm",
            "output": "dist/main.js"
        },
        "scripts": {
            "make": "elm make $npm_package_config_input --output $npm_package_config_output",
            "make:dev": "npm run make -- --debug",
            "make:prod": "npm run make -- --optimize",
            "postmake:prod": "uglifyjs $npm_package_config_output --compress 'pure_funcs=\"F2,F3,F4,F5,F6,F7,F8,F9,A2,A3,A4,A5,A6,A7,A8,A9\",pure_getters,keep_fargs=false,unsafe_comps,unsafe' | uglifyjs --mangle --output=$npm_package_config_output"
        }
    }
    

    因此,如果您有想要在多个 npm 脚本中使用的配置变量,您可以将它们添加到 package.jsonconfig 字典中。之后,您可以通过名称 $npm_package_config_<name> 在 npm 脚本中将它们作为环境变量访问,其中 <name> 是您的配置变量的名称。

    我还使用 post 脚本而不是进程替换来丑化 Elm 编译器的输出。这样做总体上比通过bash -c 使用进程替换更轻松。

    最后,您可以针对不同的构建运行 makemake:devmake:prod。第一个是常规构建。第二个是使用 Elm 调试工具的开发版本。第三个是常规构建,针对生产使用进行了优化和缩小。

    【讨论】:

    • 有趣,我以为你想"文字参数传递给 npm 脚本?"。而不是硬编码它们。
    • 这是XY problem。我的实际问题是我只想定义一次 output 并在多个命令中使用它。在我的第一次尝试中,我尝试在make 脚本中定义变量OUTPUT,然后在make:devmake:prod 脚本中定义如何使用这个变量。但是,这不起作用,因为npm run 用双引号替换了单引号。因此,我询问了如何将文字参数传递给 npm 脚本。对于那个很抱歉。我将编辑我的问题并询问我真正的问题。
    • 当然,不用担心。我知道在这种情况下跨平台不是必需的,但是值得注意的是,当引用环境变量时,例如$npm_package_config_output 使用 windows cmd.exe 语法变为 %npm_package_config_output% (注意前导和尾随 %而不是美元 $ 前缀) - cross-var 可以在需要跨平台的情况下提供帮助。
    • @RobC 我一直想硬编码变量的值。但是,我想在不同的命令中以不同的方式使用该变量。因此,我将参数传递给 npm scirpts,其中描述了如何处理硬编码变量。但是,代码正在执行,而不是按字面意思传递给 bash。希望这更有意义。
    • 对跨平台环境变量使用cross-var。感谢您提供这些信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2016-01-24
    • 2016-03-01
    • 2018-12-03
    • 2011-10-17
    相关资源
    最近更新 更多