Heroku 无法加载 ./.env

Heroku failed to load ./.env

我的问题

我在 Heroku 产品中加载我的环境变量时遇到问题。 推送到 Heroku 时,我在构建脚本期间收到以下错误消息:

Failed to load ./.env.

当前设置

我在本地应用程序的根目录中使用 .env 文件。我可以使用 dotenv-webpack 插件成功加载我的环境变量,如下所示:

//webpack.config

const Dotenv = require('dotenv-webpack')
module.exports = {
  // other settings...
  
  plugins: [
    new Dotenv(),
  ]
};

加载环境变量:

//server.js

require('dotenv').config();
console.log(process.env.MY_VARIABLE);

这在本地很有用,但在 Heroku 上失败了。

Note: My config vars have been set on Heroku, so that's not the problem.


我试过的

我已经尝试过从我的应用程序的根目录强制加载 .env 文件,如下所示:

new Dotenv({ path: path.resolve(__dirname, './.env') });

有人还指出 Heroku 环境可能是系统范围的环境变量,所以我尝试使用以下方式加载它们:

new Dotenv({ systemVars: true });

这些尝试都不适合我。


我的猜测

我注意到 Heroku 将他们的 .env 文件保存在 ./tmp/build_someRandomBuildId/.env 下。我的猜测是 .env 文件不在目录的根目录中,因此 dotenv 找不到它的原因。也无法在我的 Webpack 配置中硬编码此文件的位置,因为构建 ID 是随每个构建随机生成的。有没有办法告诉 Webpack 在动态位置查找文件?

我终于找到了解决办法,留在这里给和我有同样问题的人。

我使用 dotenv-webpack 在本地设置我的环境变量,这非常有效。另一方面,Heroku 会自动设置它们的环境变量,因此无需您自己设置。无需查找 .env 文件。我所要做的就是将我的 webpack.config 分成 2 个单独的文件。

//webpack.dev

require('dotenv').config();

plugins: [
  new Dotenv()
],

在本地加载 .env 文件。

//webpack.prod

require('dotenv').config();

plugins: [
  new webpack.DefinePlugin({
    'process.env': {
      'YOUR_VARIABLE': JSON.stringify(process.env.YOUR_VARIABLE),
    }
  });
]

从 Heroku 获取您的环境变量并将它们写入您自己的 process.env

如果你没有使用 Webpacks,这个想法的解决方案与接受的答案类似。 Heroku 默认在 "production" 模式下工作,所以如果 Heroku 中的问题是 Dotenv(无论如何都不应该在 Heroku 中使用),请在生产时禁用 Dotenv,如下所示:

if (process.env.NODE_ENV !== 'production') { 
   require('dotenv').config() }
}

...然后,只需执行以下操作即可访问环境变量:

var someVar = process.env.SOME_VARIABLE;

不要忘记先在 Heroku 上设置环境变量,方法是使用应用仪表板中的控制台命令行,或使用 app.json 文件。

今天我偶然发现了这个问题,我尝试了几种解决方案,但 none 奏效了。我的应用程序在本地运行,但在生产模式 (heroku) 下它没有正确加载 process.env。

然后我发现了这个https://www.npmjs.com/package/dotenv-webpack

//webpack.config.js
  plugins: [
      new Dotenv({ systemvars: true }),
  ], 

只需将 systemvars 设置为 true 即可。 现在,我已经使用不同的密钥对 .env 文件和 heroku 仪表板进行了测试;它们没有连接,并且它们在生产或开发模式下正确地替换了它们自己。

使用包“dotenv-webpack”代替“dotenv”。

我希望这可以为面临相同问题的任何人节省一些时间