Heroku无法加载./.env文件。

3

我的问题

我在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上失败了。

注意:我的配置变量已经在Heroku上设置好了,所以那不是问题。


我尝试过的

我已经尝试强制从应用程序根目录下加载 .env 文件,像这样:

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

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

new Dotenv({ systemVars: true });

这两种尝试都没有成功。


我的猜测

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


这个回答解决了你的问题吗?Node.js环境变量和Heroku部署 - ChrisGPT was on strike
不是这样的,在Heroku中设置环境变量是可以的,但在生产环境中加载它们失败了,因为Heroku上的.env文件位于动态生成的目录中,所以我无法直接在我的webpack.config中指向它。不过,我找到了解决办法,等我下班后会在这里发布答案。感谢您的时间。 - Luïs
由于Heroku上的.env文件位于动态生成的目录中,我不确定是否理解这一点。在Heroku上不应该有.env文件。.env文件和像dotenv这样的库的整个意义在于设置环境变量,但是Heroku的配置变量可以直接实现这一点。.env文件在开发过程中非常有用,不应包含在您推送的代码中。 - ChrisGPT was on strike
你是对的,我误解了这个错误。Webpack在那个动态生成的目录中寻找一个.env文件。显然它没有找到,因为正如你所说,那里没有.env文件。因此出现了这个错误。 - Luïs
3个回答

8

今天我遇到了这个问题,尝试了几种解决方案,但都没有生效。我的应用在本地可以正常运行,但在生产模式(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”。

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


4

我终于找到了解决方案,把这个留在这里给有同样问题的人。

我使用 dotenv-webpack 在本地设置我的环境变量,它非常好用。然而 Heroku 自动设置他们的环境变量,所以不需要自己设置。也不需要寻找 .env 文件。我所要做的就是把我的 webpack.config 分成两个独立的文件。

//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中。


1
如果您没有使用Webpack,那么这个解决方案与被接受的答案类似。 Heroku默认在“生产”模式下工作,因此如果Heroku中的问题与Dotenv有关(在Heroku中不应该使用),请像这样在生产时间禁用Dotenv的使用:
if (process.env.NODE_ENV !== 'production') { 
   require('dotenv').config() }
}

...然后,只需这样访问环境变量:

var someVar = process.env.SOME_VARIABLE;

不要忘记在Heroku上使用控制台命令行或者app.json文件先设置环境变量。


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