如何定义一个可以在多个npm脚本中自动使用的环境变量?
How to define an environment variable that can be automatically used in multiple npm scripts?
考虑以下 npm 脚本。
$ npm run
available via `npm run-script`:
make
OUTPUT=dist/main.js bash -c 'elm make src/Main.js --output=[=10=] '
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=[=11=] ' '$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=[=12=] ' "$OUTPUT" "--debug"
因此,输出不是我期望的那样。无需编写自定义 shell 脚本即可解决此问题的最佳方法是什么?我想在两个不同的命令中使用 OUTPUT
变量。但是,我只想在一个地方定义它。
我是这样解决问题的
{
"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.json
的 config
字典中。之后,您可以通过名称 $npm_package_config_<name>
在 npm 脚本中将它们作为环境变量访问,其中 <name>
是您的配置变量的名称。
我还使用了 post 脚本而不是进程替换来丑化 Elm 编译器的输出。与通过 bash -c
.
使用流程替换相比,这样做总体上没有那么麻烦
最后,您可以 运行 make
、make:dev
或 make:prod
用于不同的版本。第一个是常规构建。第二个是使用 Elm 调试工具的开发构建。第三个是常规构建,针对生产使用进行了优化和缩小。
考虑以下 npm 脚本。
$ npm run
available via `npm run-script`:
make
OUTPUT=dist/main.js bash -c 'elm make src/Main.js --output=[=10=] '
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=[=11=] ' '$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=[=12=] ' "$OUTPUT" "--debug"
因此,输出不是我期望的那样。无需编写自定义 shell 脚本即可解决此问题的最佳方法是什么?我想在两个不同的命令中使用 OUTPUT
变量。但是,我只想在一个地方定义它。
我是这样解决问题的
{
"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.json
的 config
字典中。之后,您可以通过名称 $npm_package_config_<name>
在 npm 脚本中将它们作为环境变量访问,其中 <name>
是您的配置变量的名称。
我还使用了 post 脚本而不是进程替换来丑化 Elm 编译器的输出。与通过 bash -c
.
最后,您可以 运行 make
、make:dev
或 make:prod
用于不同的版本。第一个是常规构建。第二个是使用 Elm 调试工具的开发构建。第三个是常规构建,针对生产使用进行了优化和缩小。