web-dev-qa-db-fra.com

Comment utiliser les variables d'environnement dans package.json

Parce que nous ne voulons pas de données sensibles dans le code du projet, y compris le fichier package.json, l'utilisation de variables d'environnement serait à mon avis un choix logique.

Exemple 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"

Est-ce possible?

(La question est pas si c'est sage ou pas bon, juste si c'est possible)

Cordialement!

JE.

21
kaasdude

J'ai des exigences similaires mais différentes. Pour moi, je veux utiliser des variables d'environnement dans les scripts.

Au lieu d'utiliser les variables d'environnement directement dans package.json, je fais:

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

Et dans some-script.sh:

#!/bin/sh

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

Non, ce n'est pas possible. Vous devez accéder au référentiel à l'aide de git+ssh, et stockez une clé privée dans ~/.ssh.

Votre ligne ressemble alors à:

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

Qui ne contient rien de sensible.

2
Steve Bennett

Voici comment j'ai réussi à contourner package.json pour atteindre le même objectif. Il utilise un script qui lit à partir d'une section personnalisée de package.json pour les modules URL, y interpole les variables d'environnement et les installe avec npm install --no-save (les --no-save peut être omis, selon le cas d'utilisation).

En bonus: il essaie de lire la variable env depuis .env.json, qui peut être gitignore, et très utile pour le développement.

  1. Créez un script qui lira à partir d'une section personnalisée de 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. Ajouter un "postinstall": "node env-dependencies.js" à ton package.json, de cette façon, il sera exécuté sur tous les npm install

  2. Ajoutez votre dépôt git privé à package.json en utilisant les URL souhaitées (remarque: elles doivent toutes avoir un package.json à la racine!):

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

(le spécificateur semver #semver:^2.0.0 peut être omis, mais fait référence à une balise git, ce qui peut être très utile, car il fait de votre serveur git un gestionnaire de paquets à part entière)

  1. npm install
1
Christophe Marois

Non, ce n'est pas possible car npm ne traite aucune valeur de chaîne comme n'importe quel type de modèle.

Il peut être préférable d'utiliser simplement git+ssh (si votre fournisseur le prend en charge) avec un agent ssh.

1
mscdex

Vous pouvez utiliser des valeurs d'environnement pour injecter dans votre package.json comme ceci:

Toutes les variables d'environnement commençant par npm_config_ seront interprétées comme un paramètre de configuration. Par exemple, mettre npm_config_foo = bar dans votre environnement définira le paramètre de configuration foo sur bar. Toutes les configurations d'environnement auxquelles aucune valeur n'est attribuée recevront la valeur true. Les valeurs de configuration ne respectent pas la casse, donc NPM_CONFIG_FOO = bar fonctionnera de la même manière.

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

0
hakunin