如 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 启动程序