在一个 npm 脚本中设置一个 env 变量,稍后可以在另一个脚本中访问
Set an env variable in one npm script that can later be accessed in another script
在包的 package.json
中,我有两个脚本。一个启动服务器进行测试,一个启动测试:
"scripts": {
"start": "webpack-dev-server --config ./webpack.config.js --no-inline",
"test": "jest"
}
请注意,start
是一个启动服务器的后台脚本,然后在终端中停留 运行ning,直到它被手动中断 (Ctrl + C)。所以 npm run test
脚本必须在单独的终端中执行。
但是,服务器也可以从另一个服务器包启动(在 monorepo 的上下文中使用 lerna),由该包的 package.json
:
"scripts": {
"debug": "DEBUG=* ts-node src/"
}
同样,这也是启动服务器然后在终端中停留 运行ning 直到它被手动中断 (Ctrl + C) 的后台脚本。
我希望我的测试文件知道在执行脚本 npm run test
时服务器是如何启动的。这可以通过设置或更改启动脚本中的 env 变量来完成,稍后将在测试文件中检查该变量。如果设置了该 env 变量,则测试将知道其服务器是由该包中的用户 运行ning npm run start
预先启动的。如果不是,那么测试将知道服务器是由在另一个包中执行 npm run debug
的用户启动的。然后它将能够 运行 一些条件代码,例如:
if (process.env.server_from_start) {
...
} else {
...
}
我已经通过以下方式从脚本中共享环境变量:
"scripts": {
"script1": "export FOO=bar && bash script_that_echos_FOO.sh",
"script2": "bash script_that_echos_FOO.sh"
}
FOO 在我 运行 npm run script1
时正确回显,但在我 运行 npm run script2
.
时没有任何回显
我从 this 文章中标题为 Accessing variables in multiple scripts
的段落中找到了解决方案。
想法是 runner
脚本负责设置 cross-script 环境变量并 运行 设置后续脚本。当 runner
生成 child 进程 运行 后继脚本 script1/script2
时,child 进程将可以访问 runner
中定义的环境变量.我相信这就是为什么当你 运行 你原来的 script2
没有输出时,因为原来的 script1
和 script2
在独立的进程中 运行。
更新的脚本:
"scripts": {
"runner": "FOO=bar npm run",
"script1": "bash script_that_echos_FOO.sh",
"script2": "bash another_script_that_echos_FOO.sh",
"multiScript": "npm-run-all script1 script2"
}
runner
脚本将通过以下方式调用。 --
之后的参数附加到 runner
脚本的末尾,并在设置 FOO
环境变量后告诉 运行 哪个脚本。
此外,我添加了如何使用 npm-run-all
运行 多个脚本,以便从 runner
生成的所有脚本都可以访问 FOO
环境变量。
npm run runner -- script1 // script1 runs and has access to FOO
npm run runner -- script2 // script2 runs and has access to FOO
npm run runner -- multiScript // script1 and script2 run (sequentially) with both having access to FOO
我想补充一点,当你有一个需要设置的动态环境变量时,这个方法非常有用。出于我的目的,它是在执行某些测试之前检索并设置所需的令牌。以下示例将环境变量设置为脚本的结果。
"scripts": {
"runner": "FOO=$(node ./retrieveDynamicToken.js) npm run",
...
}
在包的 package.json
中,我有两个脚本。一个启动服务器进行测试,一个启动测试:
"scripts": {
"start": "webpack-dev-server --config ./webpack.config.js --no-inline",
"test": "jest"
}
请注意,start
是一个启动服务器的后台脚本,然后在终端中停留 运行ning,直到它被手动中断 (Ctrl + C)。所以 npm run test
脚本必须在单独的终端中执行。
但是,服务器也可以从另一个服务器包启动(在 monorepo 的上下文中使用 lerna),由该包的 package.json
:
"scripts": {
"debug": "DEBUG=* ts-node src/"
}
同样,这也是启动服务器然后在终端中停留 运行ning 直到它被手动中断 (Ctrl + C) 的后台脚本。
我希望我的测试文件知道在执行脚本 npm run test
时服务器是如何启动的。这可以通过设置或更改启动脚本中的 env 变量来完成,稍后将在测试文件中检查该变量。如果设置了该 env 变量,则测试将知道其服务器是由该包中的用户 运行ning npm run start
预先启动的。如果不是,那么测试将知道服务器是由在另一个包中执行 npm run debug
的用户启动的。然后它将能够 运行 一些条件代码,例如:
if (process.env.server_from_start) {
...
} else {
...
}
我已经通过以下方式从脚本中共享环境变量:
"scripts": {
"script1": "export FOO=bar && bash script_that_echos_FOO.sh",
"script2": "bash script_that_echos_FOO.sh"
}
FOO 在我 运行 npm run script1
时正确回显,但在我 运行 npm run script2
.
我从 this 文章中标题为 Accessing variables in multiple scripts
的段落中找到了解决方案。
想法是 runner
脚本负责设置 cross-script 环境变量并 运行 设置后续脚本。当 runner
生成 child 进程 运行 后继脚本 script1/script2
时,child 进程将可以访问 runner
中定义的环境变量.我相信这就是为什么当你 运行 你原来的 script2
没有输出时,因为原来的 script1
和 script2
在独立的进程中 运行。
更新的脚本:
"scripts": {
"runner": "FOO=bar npm run",
"script1": "bash script_that_echos_FOO.sh",
"script2": "bash another_script_that_echos_FOO.sh",
"multiScript": "npm-run-all script1 script2"
}
runner
脚本将通过以下方式调用。 --
之后的参数附加到 runner
脚本的末尾,并在设置 FOO
环境变量后告诉 运行 哪个脚本。
此外,我添加了如何使用 npm-run-all
运行 多个脚本,以便从 runner
生成的所有脚本都可以访问 FOO
环境变量。
npm run runner -- script1 // script1 runs and has access to FOO
npm run runner -- script2 // script2 runs and has access to FOO
npm run runner -- multiScript // script1 and script2 run (sequentially) with both having access to FOO
我想补充一点,当你有一个需要设置的动态环境变量时,这个方法非常有用。出于我的目的,它是在执行某些测试之前检索并设置所需的令牌。以下示例将环境变量设置为脚本的结果。
"scripts": {
"runner": "FOO=$(node ./retrieveDynamicToken.js) npm run",
...
}