读取环境变量,然后在使用gulp构建prod或dev代码时在客户端JS中替换它们

时间:2019-04-11 18:42:30

标签: javascript gulp

所以可以说我在js中有一些代码

const myApiKey = 'id_0001'

但是我不想对其进行编码,而不是将其与其他env vars放在一些bash脚本中,然后从中读取,然后将其替换为JS

因此,假设我会从prod-env.sh读取产品,或者对于dev我会从dev-env.sh读取它们,然后gulp或其他工具发挥作用,并根据其中建立的内容替换MY_API_KEY prod-env.shdev-env.sh

const myApiKey = MY_API_KEY

更新:我想补充一点,我只关心UNIX操作系统,而不关心Windows。在golang中,有一种方法可以读取例如envVars.get('MY_API_KEY'),我在寻找类似的东西,但在客户端使用JS。

2 个答案:

答案 0 :(得分:3)

如果您正在使用gulp,听起来您可以使用任何gulp字符串替换程序,例如gulp-replace

关于编写gulp任务。如果愿意先将环境导入外壳程序,则在运行节点之前,可以通过process.env

访问该环境。
gulp.task('build', function(){
  gulp.src(['example.js'])
    .pipe(replace('MY_API_KEY', process.env.MY_API_KEY))
    .pipe(gulp.dest('build/'));
});

如果您不想在运行节点之前导入环境文件,则可以使用env2之类的库来读取Shell环境文件。

另一种选择是使用js / json定义那些环境文件,并使用require加载它们。

prod-env.js

{
  "MY_API_KEY": "api_key"
}

gulpfile.js

const myEnv = require('./prod-env')

gulp.task('build', function(){
  gulp.src(['example.js'])
    .pipe(replace('MY_API_KEY', myEnv.MY_API_KEY))
    .pipe(gulp.dest('build/'));
});

此外,对于更通用的循环替换版本,您可以执行以下操作:

gulp.task('build', function () {
  stream = gulp.src(['example.js']);

  for (const key in process.env) {
    stream.pipe('${' + key + '}', process.env[key]); 
  }

  stream.pipe(gulp.dest('build/'));
});

在最后一个示例中,我在环境变量名称周围添加了${},以减少发生事故的可能性。因此,源文件变为:

const myApiKey = ${MY_API_KEY}

答案 1 :(得分:1)

对于不想触摸正在管理的代码的人,此答案是一种简便的方法。例如,您是运维团队的成员,而不是开发团队的成员,则需要按照您的描述进行操作。

环境变量NODE_OPTIONS可以控制有关node.js运行时的许多事情-请参见https://nodejs.org/api/cli.html#cli_node_options_options

我们可以设置的一个这样的选项是--require,它使我们可以在加载其他任何内容之前运行代码。

因此,您可以使用它创建一个overwrite.js文件以对所有非node_modules脚本文件执行此替换:

const fs = require('fs');
const original = fs.readFileSync;

// set some custom env variables
// API_KEY_ENV_VAR - the value to set
// API_KEY_TEMPLATE_TOKEN - the token to replace with the value

if (!process.env.API_KEY_TEMPLATE_TOKEN) {
  console.error('Please set API_KEY_TEMPLATE_TOKEN');
  process.exit(1);
}

if (!process.env.API_KEY_ENV_VAR) {
  console.error('Please set API_KEY_ENV_VAR');
  process.exit(1);
}

fs.readFileSync = (file, ...args) => {
  if (file.includes('node_modules')) {
    return original(file, ...args);
  }
  const fileContents = original(file, ...args).toString(
    /* set encoding here, or let it default to utf-8 */
  );
  return fileContents
    .split(process.env.API_KEY_TEMPLATE_TOKEN)
    .join(process.env.API_KEY_ENV_VAR);
};

然后将其与以下命令一起使用:

export API_KEY_ENV_VAR=123;
export API_KEY_TEMPLATE_TOKEN=TOKEN;
NODE_OPTIONS="--require ./overwrite.js" node target.js

假设您有一个脚本target.js

console.log('TOKEN');

它将记录为123。您可以在node上将其广泛使用,因此它可以与gulp,grunt或其他任何设备一起正常使用。