Читайте переменные окружения, а затем заменяйте их в JS на стороне клиента при использовании gulp для сборки кода prod или dev - PullRequest
2 голосов
/ 11 апреля 2019

Итак, допустим, у меня есть некоторый код в js

const myApiKey = 'id_0001'

Но вместо того, чтобы харкодировать его, я хочу поместить его в некоторый скрипт bash с другими переменными env и прочитать из него, а затем заменить его в JS

Итак, скажем, для prod, который я прочитал бы из prod-env.sh, или для dev, я бы прочитал их из dev-env.sh, а затем gulp или какой-то другой инструмент выполняет магию и заменяет MY_API_KEY в зависимости от того, что установлено внутри prod-env.sh или dev-env.sh.

const myApiKey = MY_API_KEY

Обновление: я хочу добавить, что меня волнует только ОС Unix, а не Windows.В golang есть способ прочитать, например, envVars.get ('MY_API_KEY'), я ищу что-то подобное, но для JS на стороне клиента.

Ответы [ 2 ]

3 голосов
/ 14 апреля 2019

Если вы используете 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 для чтения файлов среды оболочки.

Другой вариант - использовать 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 голос
/ 14 апреля 2019

Этот ответ - простой способ сделать это для тех, кто не хочет трогать код, которым они управляют. Например, вы работаете в команде ops, но не в команде разработчиков и вам нужно делать то, что вы описываете.

Переменная среды 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. Вы можете использовать это в значительной степени универсально с узлом, поэтому оно должно прекрасно работать с gulp, grunt или любыми другими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...