如何以跨平台的方式设置环境变量?

18

对于Windows系统,我的Node脚本应该像这样:

"scripts": {
    "start-docs": "SET NODE_ENV=development&&babel-node ./docs/Server.js"
}

但是在Linux中没有SET,所以应该像这样:

"scripts": {
    "start-docs": "NODE_ENV=development&&babel-node ./docs/Server.js"
}

有没有一种声明环境变量的方式是跨平台的并且保持一致性的?

3个回答

25

我最近发现了cross-env项目。它非常简单明了。

{
  "scripts": {
    "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js"
  }
}

无论操作系统如何,这将把build环境变量设置为production


1
cross-env 进入维护模式,该仓库已被存档。 - CallMeLaNN
2
@CallMeLaNN 是的,但不是因为它已被弃用,而是因为它的作者认为它已经具备了完整的功能。他致力于继续提供错误修复并支持新的Node JS版本。所以在我看来,cross-env仍然是最佳解决方案。 - Stijn de Witt

2
我会反对将此设置在 package.json 中,因为 环境变量 应该根据您的环境设置,而 package.json 在每个环境中可能是相同的(您将其提交到版本控制系统中,对吧?)。如果您正在寻找简洁通用的解决方案,您应该使用类似于dotenv 的东西。

1
dotenv建议不要提交.env文件。这是一个好主意,因为您不希望与团队成员争夺特定的本地更改。但是,将一些默认配置提交到代码库中也非常有帮助,以便可以尽快启动和运行。NPM库dotenv-extended似乎处理了这种情况,在其中提交了一组默认的环境变量,同时排除了用户本地的.env文件。它无法处理您可能需要多个默认值的情况(例如指向dev vs完全指向本地),但比仅使用.env更好。 - SamuelKDavis

0
如果你不想使用任何第三方工具,那么可以使用一个简单的nodejs脚本来实现。
逐步指南:
1. 创建./scripts/set-env.js文件,并添加以下内容:

import { argv, env } from "node:process"
import { spawn } from "node:child_process"

// Set your custom env variables here
const extenv = {
    NODE_ENV: "development",
}

spawn(argv[2], argv.slice(3), {
    env: { ...env, ...extenv },
    stdio: "inherit",
})

注意:

  • argv[2] 是传入的子 shell 要运行的命令
  • argv.slice(3) - 传入的参数
  • ...env - 用于保留当前 shell 的环境变量
  • stdio: "inherit" - 用于将子 shell 输出导入到当前 shell
  1. 编辑你的 package.json 文件中的 scripts 部分:

"scripts": {
    "set-env": "node ./scripts/set-env.js",
    "start-docs": "npm run set-env -- babel-node ./docs/Server.js"
}


说明:-- 用于将命令和参数传递给 set-env 脚本。

优点

  • 跨平台
  • 无第三方依赖
  • 完全可定制

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接