如何通过npm脚本动态修改.env文件中的STATUS变量?
问题
我正在开发一个Discord机器人项目,项目的.env文件包含敏感信息,其中有STATUS变量,当前配置为STATUS=DEVELOPMENT。代码会根据STATUS的值决定Slash命令的部署目标:
- 值为
DEVELOPMENT时,部署到开发服务器 - 值为
PRODUCTION时,部署到机器人所在的所有服务器
核心代码如下:
if (STATUS == "DEVELOPMENT") { Routes.applicationGuildCommands(CLIENT_ID, process.env.DEVELOPMENT_GUILD_ID), { body: slashCommands }, console.log( chalk.yellow(`Slash Commands • Registered Locally to the development server`) ); } else if (STATUS == "PRODUCTION") { await rest.put( Routes.applicationCommands(CLIENT_ID), { body: slashCommands }, console.log(chalk.yellow("Slash Commands • Registered Globally")) ); }
我希望在package.json中配置两个npm脚本,分别将STATUS设为PRODUCTION和DEVELOPMENT后运行项目文件,期望的脚本示例如下:
"scripts": { "prod": "changes the 'STATUS' to 'PRODUCTION' and runs the file", "dev": "changes the 'STATUS' to 'DEVELOPMENT' and runs the file" },
请问如何通过npm脚本动态修改.env文件实现这一需求?
解决方案
方法一:临时设置环境变量(无需修改.env,推荐)
不需要修改.env文件,直接在npm脚本中临时注入环境变量,优先级会覆盖.env中的值,更安全且不会污染原始配置文件。
Linux/macOS(Bash环境)
"scripts": { "dev": "STATUS=DEVELOPMENT node your-bot-file.js", "prod": "STATUS=PRODUCTION node your-bot-file.js" }
Windows(Command Prompt)
"scripts": { "dev": "set STATUS=DEVELOPMENT && node your-bot-file.js", "prod": "set STATUS=PRODUCTION && node your-bot-file.js" }
跨平台兼容(使用cross-env包)
如果需要跨Windows、Linux、macOS运行,先安装cross-env:
npm install cross-env --save-dev
然后配置脚本:
"scripts": { "dev": "cross-env STATUS=DEVELOPMENT node your-bot-file.js", "prod": "cross-env STATUS=PRODUCTION node your-bot-file.js" }
方法二:动态修改.env文件
如果一定要修改.env文件的内容,可以用命令行工具实现:
Linux/macOS(使用sed命令)
"scripts": { "dev": "sed -i '' 's/^STATUS=.*/STATUS=DEVELOPMENT/' .env && node your-bot-file.js", "prod": "sed -i '' 's/^STATUS=.*/STATUS=PRODUCTION/' .env && node your-bot-file.js" }
注:部分Linux发行版不需要
'',直接用sed -i 's/^STATUS=.*/STATUS=PRODUCTION/' .env
Windows(使用PowerShell命令)
"scripts": { "dev": "(Get-Content .env) -replace '^STATUS=.*', 'STATUS=DEVELOPMENT' | Set-Content .env; node your-bot-file.js", "prod": "(Get-Content .env) -replace '^STATUS=.*', 'STATUS=PRODUCTION' | Set-Content .env; node your-bot-file.js" }
跨平台兼容(使用dotenv-cli+replace-in-file包)
- 安装依赖:
npm install dotenv-cli replace-in-file --save-dev
- 配置脚本:
"scripts": { "dev": "replace-in-file '^STATUS=.*' 'STATUS=DEVELOPMENT' .env && dotenv -e .env node your-bot-file.js", "prod": "replace-in-file '^STATUS=.*' 'STATUS=PRODUCTION' .env && dotenv -e .env node your-bot-file.js" }
内容的提问来源于stack exchange,提问作者bradys dev
相关产品推荐
相关产品推荐

