You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

npm脚本切换目录后dotenv无法读取.env变量的解决办法

解决方案

这里有几个不用转成.js脚本的可行方案,直接在npm脚本里就能解决:

1. 明确指定dotenv的.env文件路径

dotenv支持通过-e参数指定.env文件的绝对/相对路径,结合npm内置的$INIT_CWD变量(这个变量会一直指向你执行npm命令时的初始工作目录,不受cd操作影响),就能让cd后的命令依然读取根目录的.env文件。

修改你的npm脚本示例:

"scripts": {
  "testScript5": "cd ./temp && dotenv -e $INIT_CWD/.env cross-var echo \"$REPO_PUSH_AUTHOR\" > config.txt"
}

这样不管切换到哪个目录,dotenv都会去初始目录找.env文件,变量就能正常解析。

2. 提前解析变量再传递

在cd到子目录之前,先把需要的环境变量用dotenv解析出来,存在shell变量里,cd之后直接用这个shell变量,不用再依赖dotenv读取文件。

示例脚本:

"scripts": {
  "testScript5": "REPO_PUSH_AUTHOR=$(dotenv -v REPO_PUSH_AUTHOR) && cd ./temp && echo \"$REPO_PUSH_AUTHOR\" > config.txt"
}

这里dotenv -v REPO_PUSH_AUTHOR会直接输出变量的值,存到shell变量里,cd后直接用这个变量就行,甚至可以不用cross-var(如果只是简单写入操作的话)。

3. 给子目录创建.env软链接(类Unix系统适用)

如果你的项目主要在Linux/macOS环境运行,可以在temp目录创建一个指向根目录.env的软链接,这样cd到temp后,dotenv会自动读取这个软链接指向的原文件。

可以把创建软链接的步骤加到脚本开头:

"scripts": {
  "testScript5": "ln -sf ../.env ./temp/.env && cd ./temp && cross-var echo \"$REPO_PUSH_AUTHOR\" > config.txt"
}

-sf参数会强制覆盖已存在的链接,避免报错。Windows环境可以用mklink .\temp\.env ..\.env替代ln命令,但需要注意权限问题。

内容的提问来源于stack exchange,提问作者Vitalii Vasylenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:20:12