如何结合Node.js --env-file特性与PNPM运行脚本
如何在PNPM脚本中借助Node.js的--env-file注入环境变量
场景说明
我有一个.env文件,内容如下:
STH=1
在Node.js 20中,可通过以下命令直接读取该文件的环境变量:
node --env-file=.env -e "console.log(process.env.STH)"
执行后输出:
1
现在希望让PNPM运行的脚本(比如示例中的prettier)也能访问.env中的所有环境变量,但注意--env-file参数不允许在NODE_OPTIONS中使用。
可行方案
方案1:用Node.js包裹脚本执行
利用Node.js加载环境变量后,通过子进程调用目标脚本,子进程会继承当前Node进程的环境变量。在package.json中配置脚本如下:
{ "scripts": { "prettier": "node --env-file=.env -e \"require('child_process').execSync('pnpm exec prettier', { stdio: 'inherit' })\"" } }
执行pnpm prettier时,Node会先加载.env的环境变量,再启动prettier进程,此时prettier就能访问到STH等环境变量。
方案2:Unix-like系统下直接导出环境变量
通过Node.js读取并输出环境变量的导出语句,再通过eval执行后启动PNPM脚本:
eval $(node --env-file=.env -e "console.log(Object.entries(process.env).map(([k, v]) => `export ${k}='${v.replace(/'/g, "\\'")}'`).join('\n'))") && pnpm prettier
该命令会先让Node加载.env,然后将所有环境变量转为export语句,通过eval注入当前shell,再执行pnpm prettier,此时脚本就能访问到对应的环境变量。
注意事项
--env-file是Node.js 20+的特性,确保你的Node版本符合要求。- 如果目标脚本是Node.js编写的(而非prettier这类可执行文件),也可以直接用
node --env-file=.env ./your-script.js的方式启动,但prettier这类二进制脚本需要通过子进程或shell环境继承的方式获取变量。
内容的提问来源于stack exchange,提问作者madflow
相关产品推荐
相关产品推荐

