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)