Skip to content

Instantly share code, notes, and snippets.

@qiulang
Created November 11, 2018 05:48
Show Gist options
  • Save qiulang/31750f4cec0fe8aa800c1c5ccc032006 to your computer and use it in GitHub Desktop.
Save qiulang/31750f4cec0fe8aa800c1c5ccc032006 to your computer and use it in GitHub Desktop.

如何设置环境变量

12factor 所述, 我们的程序在不同的环境、不同平台的环境变量不同,如何有效的让程序读取环境变量一直是个问题。

上一个项目用了 per-env ,但 per-env 在 windows 上有bug 需要改它的代码,使用 cross-spawn

更重要问题是,per-env 其实就是把环境变量写在 package.json 里,感觉不如直接用 .env 包,避免 package.json 承载太多功能。

使用 .env 最大问题,它不建议把 .env 加到版本库,也不建议有多个.env 文件;但我们实际使用感觉就是要共享.env 文件,而且不同平台有不同 env 文件配置才能方便大家开发,所以到底这么解决?

这个问题在 .env 里也被提到 how can I handle multiple environments? 有一个答复是他开发了一个包[dotenv-flow] https://github.com/kerimdzhanov/dotenv-flow 正好解决这两个问题。

dotenv-flow 只有 46 个星,通常我们不会选这样星值的项目,但因为它的代码很简单,看下就明白,所以确认可用。

注,一个相关问题:为什么 node 程序能直接从命令行启动参数中读出环境变量;为什么在 Windows 里不可以? 这也是困扰我很久的问题,在 SO 上问了,但自己找到答案

所以要想在 Windows 这么做(就是 script 脚本夸平台)经常看到要使用cross-env 这个包,但用它还是没解决如何配多个环境变量问题。所以我们不用 cross-env, 并做这样的假定: 非生产平台我们缺省假定 NODE_ENV=development ,所有环境变量都从 .env.env.development读出;生产平台只在 linux,所以可以通过 NODE_ENV=production node xxx 启动程序

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment