1

在 nodejs 项目中如果

  • 我有index.js包含以下内容的文件
const path = require('path');
require('dotenv').config({ path: path.join(__dirname, '/.env') });

console.log(process.env.ENVIRONMENT_VARIABLE);
  • 我有.env包含以下内容的文件
ENVIRONMENT_VARIABLE=a
...and more environment variables
  • 然后我去 bash 并运行以下命令
export ENVIRONMENT_VARIABLE=b && node ./index.js

ENVIRONMENT_VARIABLE运行应用程序后我将获得 的价值是b(在 bash 中反抗)


但是在 webpack 项目中如果

  • 我有index.js包含以下内容的文件
console.log(process.env.ENVIRONMENT_VARIABLE);
  • 而且我的.env文件与前一个相同(在 nodejs 项目中)
  • 而我的 webpack 配置如下
const path = require('path');
const webpack = require('webpack');
const dotenv = require('dotenv').config({ path: path.join(__dirname, '/.env') });

module.exports = {
  ...
  entry: path.join(__dirname, '/index.js'),
  ...
  plugins: [
    ...
    new webpack.DefinePlugin({
      'process.env': JSON.stringify(dotenv.parsed)
    }),
    ...
  ],
  ...
};
  • 然后我去 bash 并运行以下命令
export ENVIRONMENT_VARIABLE=b && yarn start

ENVIRONMENT_VARIABLE运行应用程序后我将获得 的值是a(在.env文件中阻止)而不是b(在 bash 中阻止)

但是ENVIRONMENT_VARIABLE我想要获得的价值是b(在 bash 中拒绝)而不是a(在.env文件中拒绝)。如果ENVIRONMENT_VARIABLE没有在 bash 或系统中定义,我想要获得的值是a(在.env文件中定义)

4

2 回答 2

0

parsed返回的dotenv.config是从您的path( .env) 加载的内容,并且不考虑您的环境中已经存在的内容 (ie process.env)。该config方法分配给process.env基于parsed(但不会覆盖)。

仅传递您打算在 Webpack 中使用的变量process.env应该可以解决您的问题:

new webpack.DefinePlugin({
    'process.env.ENVIRONMENT_VARIABLE': JSON.stringify(process.env.ENVIRONMENT_VARIABLE)
})
于 2019-09-05T16:52:34.930 回答
-1

此用例已在此处报告和讨论,https://github.com/motdotla/dotenv/issues/199。或者,如果符合您的要求,您可以使用它https://www.npmjs.com/package/dotenv-override

const dotenv = require('dotenv')
const envConfig = dotenv.parse(fs.readFileSync('.env.override'))
for (var k in envConfig) {
 process.env[k] = envConfig[k]
} 

上面的例子引用自 dotenv-override 注册表

于 2019-09-05T11:36:31.943 回答