web-dev-qa-db-ja.com

npm-scriptsで環境変数を渡す

Scriptsキーに次の(簡略化された)コンテンツを含むpackage.jsonがあります。

...
scripts: {
   "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js",
   "poststart": "echo $NODE_ENV"
}
...

コマンドラインから実行できます:

npm start

これにより、start-app.jsスクリプトが実行され、process.env.NODE_ENV環境変数が「production」に設定されます。構文の説明については、 here をご覧ください。

here のように、ポストスタートは開始後に自動的に実行されます。

ただし、ポストスタートはNODE_ENVシェル環境変数を「継承」しないため、echoコマンドは何もエコーしません。

私の制作コードはもう少し複雑ですが、私が達成しようとしているのは、NODE_ENV変数を「開始点」から依存スクリプトに渡すことです。その方法に関する提案/ベストプラクティスはありますか?

私はやりたいかもしれないので、ポストスタートでNODE_ENVをハードコードしたくありません:

NODE_ENV=development npm start

そして、すべての「連鎖」が同じ環境を継承することを望みます。

33
Hans

いくつかのオプションがあります:

  • better-npm-run 、各コマンドのenvを個別に定義できます
  • poststartスクリプトの代わりに、npmのコマンドを次のように連結できます:"start": "NODE_ENV=${NODE_ENV:=production} node start-app.js && echo $NODE_ENV"
  • pm2 のような実稼働環境でプロセスマネージャーを使用します。 pm2では、NODE_ENVなどの設定で環境固有のjsonファイルを定義できます。私たちの会社では、pm2を使用して、すべてのアプリを異なる環境で正常に実行しています(その間、同じ開始コマンドを使用しています)。
16
Mario Tacke

これは私がやった方法です、最初に2つの開発依存関係をインストールする必要があります

https://www.npmjs.com/package/env-cmd これはファイルからenv varをロードします

https://www.npmjs.com/package/cross-env スクリプトで環境変数を使用

サンプルスクリプト:

"env-cmd ./.config/prod.env cross-env-Shell \"docker volume create $DOCKER_VOLUME\""

これはprod.envから$ DOCKER_VOLUME env varをロードします

3
tylim