Как использовать переменные среды в package.json

Поскольку мы не хотим, чтобы важные данные в коде проекта, включая файл package.json, с использованием переменных среды были бы логичным выбором, на мой взгляд.

Пример package.json:

  "dependencies": {
    "accounting": "~0.4.0",
    "async": "~1.4.2",
    "my-private-module":"git+https://${BB_USER}:${BB_PASS}@bitbucket.org/foo/bar.git"

Возможно ли это?

(Вопрос не в том, что это разумно или не хорошо, просто , если возможно)

Привет!

я.

Ответ 1

Нет, это невозможно. Вы должны получить доступ к репо с помощью git+ssh и сохранить закрытый ключ в ~/.ssh.

Ваша строка выглядит следующим образом:

"my-private-module":"git+ssh://[email protected]/foo/bar.git"

Что не содержит ничего чувствительного.

Ответ 2

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

Вместо того, чтобы использовать переменные окружения непосредственно в package.json, я делаю:

"some-script": "./scripts/some-script.sh",

И в some-script.sh:

#!/bin/sh

npm run some-other-script -- --prop=$SOME_ENV_VAR

Ответ 3

Нет, это невозможно, поскольку npm не обрабатывает никакие строковые значения как любые типы шаблонов.

Лучше просто использовать git+ssh (если ваш провайдер поддерживает его) с помощью агента ssh.

Ответ 4

Вы можете использовать значения среды для инъекции в вашем package.json следующим образом:

Любые переменные среды, начинающиеся с npm_config_, будут интерпретироваться как параметр конфигурации. Например, при установке npm_config_foo = bar в вашей среде будет установлен параметр конфигурации foo. Любые конфигурации среды, которым не присвоено значение, присваивается значение true. Значения Config нечувствительны к регистру, поэтому NPM_CONFIG_FOO = bar будет работать одинаково.

https://docs.npmjs.com/misc/config#environment-variables

Ответ 5

Вот как мне удалось обойти package.json для достижения той же цели. Он использует скрипт, который читает из пользовательского раздела package.json для модулей URL, интерполирует переменные среды в них и устанавливает их с помощью npm install --no-save (--no-save может быть опущено, в зависимости от варианта использования).

В качестве бонуса: он пытается прочитать переменную env из .env.json, которая может быть gitignore'd и очень полезна для разработки.

  1. Создайте скрипт, который будет читать из пользовательского раздела package.json

env-dependencies.js

const execSync = require('child_process').execSync
const pkg = require('./package.json')

if (!pkg.envDependencies) {
  return process.exit(0)
}

let env = Object.assign({}, process.env)

if (typeof pkg.envDependencies.localJSON === 'string') {
  try {
    Object.assign(env, require(pkg.envDependencies.localJSON))
  } catch (err) {
    console.log('Could not read or parse pkg.envDependencies.localJSON. Processing with env only.')
  }
}

if (typeof pkg.envDependencies.urls === 'undefined') {
  console.log('pkg.envDependencies.urls not found or empty. Passing.')
  process.exit(0)
}

if (
  !Array.isArray(pkg.envDependencies.urls) ||
  !(pkg.envDependencies.urls.every(url => typeof url === 'string'))
) {
  throw new Error('pkg.envDependencies.urls should have a signature of String[]')
}

const parsed = pkg.envDependencies.urls
  .map(url => url.replace(/\${([0-9a-zA-Z_]*)}/g, (_, varName) => {
    if (typeof env[varName] === 'string') {
      return env[varName]
    } else {
      throw new Error('Could not read env variable ${varName} in url ${url}')
    }
  }))
  .join(' ')

try {
  execSync('npm install --no-save ' + parsed, { stdio: [0, 1, 2] })
  process.exit(0)
} catch (err) {
  throw new Error('Could not install pkg.envDependencies. Are you sure the remote URLs all have a package.json?')
}
  1. Добавьте "postinstall": "node env-dependencies.js" в ваш package.json, чтобы он запускался при каждой npm install

  2. Добавьте свои личные git-репозитории в package.json используя package.json URL-адреса (обратите внимание: все они должны иметь package.json в корневом package.json !):

"envDependencies": {
  "localJSON": "./.env.json",
  "urls": [
    "git+https://${GITHUB_PERSONAL_ACCESS_TOKEN}@github.com/user/repo#semver:^2.0.0"
  ]
},

(спецификатор #semver:^2.0.0 может быть опущен, но относится к тегу git, который может быть очень полезен, так как делает ваш git-сервер полноценным менеджером пакетов)

  1. npm install