【问题标题】:After I get all variables that inside .env file how to replace the value of any variable of them if it defined in bash or system在我获得 .env 文件中的所有变量之后,如果它在 bash 或系统中定义,如何替换它们的任何变量的值
【发布时间】:2020-01-08 02:44:16
【问题描述】:

在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 文件中定义)

【问题讨论】:

    标签: javascript node.js bash webpack dotenv


    【解决方案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 注册表

    【讨论】:

    • 他们不是要求覆盖环境,而是实际使用环境定义的内容,而不是在他们的 .env 文件中
    • 这正是我所理解的,可能是我没有在这个答案中详细说明,第二个链接有一个像你上面给出的例子。如果在 bash 中没有覆盖,他们想使用默认的环境变量是不是
    【解决方案2】:

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

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

    new webpack.DefinePlugin({
        'process.env.ENVIRONMENT_VARIABLE': JSON.stringify(process.env.ENVIRONMENT_VARIABLE)
    })
    

    【讨论】:

    • 如果我只有一个环境变量,您的解决方案将非常适合这种情况。但是,如果我有很多环境变量,您的解决方案将不适合这种情况。
    • 从我的回答中删除ENVIRONMENT_VARIABLE,您将把所有内容都发送到 webpack,而且还有关于您的进程的潜在敏感信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2018-04-10
    • 1970-01-01
    • 2011-03-08
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多