Typescript 在一个npm脚本中设置一个env变量,以后可以在另一个脚本中访问该变量
在包的Typescript 在一个npm脚本中设置一个env变量,以后可以在另一个脚本中访问该变量,typescript,npm,jestjs,environment-variables,package.json,Typescript,Npm,Jestjs,Environment Variables,Package.json,在包的package.json中,我有两个脚本。一个启动服务器进行测试,另一个启动测试: "scripts": { "start": "webpack-dev-server --config ./webpack.config.js --no-inline", "test": "jest" } 请注意,start是一个后台脚本,用于启动服务器,然后在终端中保持运行,直到手动中断(Ctrl+C)。因此,npm运行测试脚本必须在单独的终端中执行 但是,服务器也可以从另一个服务器包启动(在mo
package.json
中,我有两个脚本。一个启动服务器进行测试,另一个启动测试:
"scripts": {
"start": "webpack-dev-server --config ./webpack.config.js --no-inline",
"test": "jest"
}
请注意,start
是一个后台脚本,用于启动服务器,然后在终端中保持运行,直到手动中断(Ctrl+C)。因此,npm运行测试
脚本必须在单独的终端中执行
但是,服务器也可以从另一个服务器包启动(在monorepo的上下文中使用lerna),该包的package.json
:
"scripts": {
"debug": "DEBUG=* ts-node src/"
}
同样,这也是启动服务器的后台脚本,然后在终端中保持运行,直到手动中断(Ctrl+C)
我想让我的测试文件知道在执行脚本npm run test
时服务器是如何启动的。这可以通过在开始脚本中设置或更改env变量来实现,该变量稍后将在测试文件中检查。如果设置了该env变量,那么测试将知道其服务器是由在该包中运行npm run start
的用户启动的。如果不是,那么测试将知道服务器是由另一个包中执行npm run debug
的用户启动的。然后,它将能够运行一些条件代码,例如:
if (process.env.server_from_start) {
...
} else {
...
}
我已经通过以下操作从脚本中共享了一个env变量:
"scripts": {
"script1": "export FOO=bar && bash script_that_echos_FOO.sh",
"script2": "bash script_that_echos_FOO.sh"
}
当我运行npm run script1
时,FOO得到了正确的响应,但当我运行npm run script2
时,什么也没有得到响应我从标题为访问多个脚本中的变量的段落中找到了一个解决方案
其思想是runner
脚本负责设置跨脚本环境变量并运行后续脚本。当runner
生成运行后续脚本script1/script2
的子进程时,子进程将可以从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
脚本将通过以下命令调用。--
之后的参数被追加到运行程序
脚本的末尾,并告知在设置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
此外,我还添加了如何使用运行多个脚本,以便从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",
...
}
我从标题为“在多个脚本中访问变量”的段落中找到了一个解决方案
其思想是runner
脚本负责设置跨脚本环境变量并运行后续脚本。当runner
生成运行后续脚本script1/script2
的子进程时,子进程将可以从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
脚本将通过以下命令调用。--
之后的参数被追加到运行程序
脚本的末尾,并告知在设置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
此外,我还添加了如何使用运行多个脚本,以便从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",
...
}
按照惯例,当测试运行程序执行脚本时,process.env.NODE\u env==='test'
。这包括开玩笑。它不需要手动设置。这是你想要的吗?不完全是。我想在一个脚本中设置一个环境变量,然后在另一个脚本中检索它(两个脚本都在同一个包中定义)。编辑OP以显示当前进展。我不确定我是否正确理解了你的案例,但似乎不可能做到你想做的事情。请参见,环境变量可能不希望持续存在。如果您想让完全不相关的脚本彼此通信,那么可能需要其他方式而不是shell环境。我认为最终可以跨脚本持久化一个env文件,但不能以npm本机支持的任何干净方式。类似于将env变量写入.env
文件,然后在第二个脚本中从该.env
文件中检索它(或者通过第二个脚本使用包调用的某个js文件)。这似乎是一种反模式。是的,这就是我的意思。文件是进程之间交换信息的最简单方式。如果退出时未清除该问题,则会发生此问题,并影响将来的启动。通常,当测试运行程序执行脚本时,process.env.NODE\u env===“test”
。这包括开玩笑。它不需要手动设置。这是你想要的吗?不完全是。我想在一个脚本中设置一个环境变量,然后在另一个脚本中检索它(其中两个脚本都是def)