package.json内から環境変数を設定する方法


313

内部からいくつかの環境変数を設定してpackage.jsonnpm start同様のコマンドで使用するにはどうすればよいですか?

これが私が現在持っているものpackage.jsonです:

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}

NODE_ENV起動スクリプトで環境変数(など)を設定しながら、1つのコマンドだけでアプリを起動できるようにしたいnpm start


あなたはこの回答読むことができますstackoverflow.com/a/57509175/11127383
ダニエルDanielecki

回答:


434

スクリプトコマンドで環境変数を設定します。

...
"scripts": {
  "start": "node app.js",
  "test": "env NODE_ENV=test mocha --reporter spec"
},
...

次にprocess.env.NODE_ENV、アプリで使用します。

注:envプラットフォーム間で確実に機能します。Mac / Linuxのみに関心がある場合は省略できます。


65
Windowsの代替案を見つけた人はいますか?
無限

65
@infinityはクロス環境を使用し、非常に使いやすいです。
mikekidder 2016年

106
@infinityの使用set NODE_ENV=test&& mocha --reporter spec-テストと&&の間にスペースがありません。
ジェイミーペニー

18
"test": "NODE_ENV=test mocha --reporter spec"Windowsシステムでは機能しません。
ベニーノイゲバウアー2017年

7
@infinity @ jamie-penney env NODE_ENV=test mocha --reporter specは、宣言された環境変数をネイティブクロスプラットフォームの方法で使用しますが、重要なのは、npmスクリプトがnpmスクリプトを実行するために、アドホックで1回限りの方法でnpmによって使用されることです。(今後の参照のために設定またはエクスポートされることはありません。)npmスクリプトからコマンドを実行している限り、問題はありません。また、このようにする場合は、「&&」を削除する必要があります。
-estaples

219

NPMパッケージcross-envを使用するだけです。超簡単。Windows、Linux、およびすべての環境で動作します。&&を使用して次のタスクに移動しないことに注意してください。環境を設定し、次のタスクを開始するだけです。クレジットここのコメントの1つにある提案の@mikekidderのです。

ドキュメントから:

{
  "scripts": {
    "build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
  }
}

複数のグローバル変数を設定したい場合は、それらを続けて記述し、その後にコマンドを実行するだけです。

最終的に、(spawnを使用して)実行されるコマンドは次のとおりです。

webpack --config build/webpack.config.js

NODE_ENV環境変数は、クロスENVによって設定されます。


トリプルバックスラッシュが必要な引用符をエスケープするために使用することができます"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
BVJ

1
クロスプラットフォームのため、最適なソリューション。
bernardn

誰かが最終的に私が使用するenvcross-envどうかを決定するのを手伝ってくれる?一方では、envは何もインストールする必要がなく、もう一方cross-envはより人気があります。誰かenvがすべてのプラットフォームで動作するかどうかを確認できますか?
リシャフ

2
@Rishav envはすべてのプラットフォームでそのままでは機能しないため、cross-env存在する理由は次のとおりです。ただ使用cross-envして、それで終わります。
TetraDev

38

私はしばしば複数の環境変数で作業しているので、それらを別の.envファイルに保存しておくと便利です(ソース管理ではこれを無視してください)。

VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break

次にexport $(cat .env | xargs) &&、スクリプトコマンドの前に追加します。

例:

{
  ...
  "scripts": {
    ...
    "start": "export $(cat .env | xargs) && echo do your thing here",
    "env": "export $(cat .env | xargs) && env",
    "env-windows": "export $(cat .env | xargs) && set"
  }
  ...
}

テストでは、npm run env(linux)またはnpm run env-windows(windows)を実行して環境変数を表示できます。


1
とても良かった、それはほとんど私のために仕事をした!コメントをいくつか追加したいと思います。-.envファイルに空の行を含めることはできません-.envファイルのコメントはスクリプトを壊します-複数のスクリプトが同じ.envファイルを使用する場合は、それを繰り返す必要があります-私は前にスペースを削除する必要がありました&&仕事にそれのために-あなたは、複数の.envファイルがある場合、それはあなたの答えを維持するために少し難しくなることがあり、この提案を準備するために私にインスピレーションを得た:stackoverflow.com/questions/25112510/...
フェリペ・N・モウラ

37

私は、将来のNode-explorersのためにここに2セントを追加したかっただけです。Ubuntu 14.04では動作NODE_ENV=testしませんでしたが、export NODE_ENV=testその後使用する必要がありましたNODE_ENV=test動作始めました。

Windowsでは使用する必要があると言われていますがset NODE_ENV=test、クロスプラットフォームソリューションの場合、cross-envライブラリはうまく機能していないようで、これを行うには本当にライブラリが必要ですか。

export NODE_ENV=test || set NODE_ENV=test&& yadda yadda

それ以外の場合、Windowsは認識されないexport NODE_ENVコマンド:Dでクラッシュするため、垂直バーが必要です。後続のスペースについてDunnoですが、念のため、私もそれらを削除しました。


6
使用しました&&か?NODE_ENV=test yadda「実行yadda、設定NODE_ENVyaddaの環境変数を。NODE_ENV=test && yadda手段『セットNODE_ENVローカル環境内ではなく、実行し、それをエクスポートしないyadda』。NODE_ENV=test yadda好ましいアプローチである。
ジョシュ・ケリー

Stackoverflowアカウントをしばらくチェックしていません。しかし、基本的にばかげたWindowsは、NODE_ENV=test && npm run testまたは同様のものを使用して動作しませんでした。process.env["NODE_ENV"] = "testing";testhelper.jsファイル内を使用して、より良いソリューションを作成しました。
TeemuK 2016年

5
@TeemuKは私の2セントも追加し&&ます。環境変数を失った状態でコマンドを実行すると、エクスポートなしで環境変数を設定すると、現在のコマンドでのみ機能します(何もありません)。uをエクスポートせずにenv変数を使用してコマンドを実行するには、次のようにします NODE_ENV=test npm run test。最後に、エクスポート後に機能したのは、セッションでur変数が使用できる(エクスポートされた)ためです。エクスポートのないNODE_ENVでは何も実行されませんでした。
Tarek

19

これをWindowsで置き換えてみてくださいYOURENV

  {
    ...
     "scripts": {
       "help": "set NODE_ENV=YOURENV && tagove help",
       "start": "set NODE_ENV=YOURENV && tagove start"
     }
    ...
  }

1
はい!ありがとうございました!これが私が探していた答えでした!:D
Daniel Tonon

6
&&の前にスペースを削除する必要がありました。
Kenneth Solberg、

@KennethSolbergのコメントは、私にとって効果的な最後の仕上げでした(Windowsのみ)
ウル

私もスペースの問題がありました。文字列の長さをログに記録すると、スペースが追加されたことがわかります。私はエスケープされた引用符を試しました-そして、それらは実際には環境変数に格納されていました。私は他の区切り文字を無駄にしてみました。この問題を回避する唯一の方法は、スペースを削除するか、値を調整することでした。
Neil Guy Lindberg

8

突然、私はactionheroが次のコードを使用していることを発見しました。これにより--NODE_ENV=production、開始スクリプトコマンドオプションを渡すだけで問題が解決しました。

if(argv['NODE_ENV'] != null){
  api.env = argv['NODE_ENV'];
} else if(process.env.NODE_ENV != null){
  api.env = process.env.NODE_ENV;
}

私は、package.jsonまたはinitスクリプトなどで環境変数を設定するより良い方法を知っている他の誰かの回答を受け入れていただければ幸いです。


4

より大きな環境変数のセットの場合、またはそれらを再利用する場合は、を使用できますenv-cmd

./.env ファイル:

# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH

./package.json

{
  "scripts": {
    "test": "env-cmd mocha -R spec"
  }
}

スクリプトでENV1をどのように使用しますか?
ValRob

通常process.env.ENV1
カラシイストヴァン

しかし、package.jsonの中では?私はそれが不可能であると読んだ(?)
ValRob

分かりません。どうしてそうするか?
カラシイストヴァン

多分ばかげたアプローチかもしれませんが、macOs Catalinaを更新しましたが、今度はコマンドmongodbが機能していないため、データ/フォルダーを指定する必要がありますmongod --dbpath ~/data/db。私は次のようなものを実行したいのですnpm mongodbが、環境変数dbpathを取得し、いつものようにmondodbを実行します...そして、他のメンバーと共有したいと思います。
ValRob

2

質問には直接回答しませんが、他の回答の上にアイデアを共有したいと思います。私が得たものから、これらのそれぞれはクロスプラットフォームの独立性を達成するためにある程度の複雑さを提供するでしょう。

私のシナリオでは、当初、JWT認証でサーバーを保護するかどうかを制御する変数を設定する(開発目的)必要がありました。

回答を読んだ後、2つの異なるファイルを作成することにしました。認証はそれぞれオンとオフになっています。

  "scripts": {
    "dev": "nodemon --debug  index_auth.js",
    "devna": "nodemon --debug  index_no_auth.js",
  }

ファイルは、元のindex.jsファイル(名前をに変更appbootstrapper.js)を呼び出す単純なラッパーです。

//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);

//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);

class AppBootStrapper {

    init(useauth) {
        //real initialization
    }
}

おそらくこれは誰かを助けることができます



2

これはWindowsコンソールで機能します

"scripts": {
  "aaa": "set TMP=test && npm run bbb",
  "bbb": "echo %TMP%"
}

npm run aaa

出力: test

詳細については、この回答を参照してください。


5
する必要がありますset TMP=test&& npm run bbb。前のスペース&&も、NODE_ENV文字列の一部として混雑します
FisNaN '27 / 04/19

@FisNaN引用符で囲む場合は当てはまりません"
カイザー

2

Windowsではgit bashを使用してください。Git Bashは、cmdとは異なる方法でコマンドを処理します。

このようにNODE_ENV = productionで環境変数を設定すると、ほとんどのWindowsコマンドプロンプトが詰まるでしょう。(例外は、ネイティブBashを使用するWindows上のBashです。)同様に、ウィンドウとPOSIXコマンドが環境変数を使用する方法にも違いがあります。POSIXでは$ ENV_VARを使用し、Windowsでは%ENV_VAR%を使用します。-クロス環境ドキュメント

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "env NODE_ENV=production tagove start"
  }
  ...
}

dotenvパッケージを使用して環境変数を宣言する


1

でENV変数を設定しないでくださいpackage.json。actionheroを使用NODE_ENVして、のファイルから読み込まれる構成オプションを変更できます./configredis構成ファイルを確認し、NODE_ENVを使用してデータベースオプションを変更する方法を確認してください。NODE_ENV=test

他のENV変数を使用して設定(おそらくHTTPポート)を行う場合でも、で何も変更する必要はありませんpackage.json。たとえばPORT=1234、ENVで設定し、それをのHTTPポートとして使用する場合NODE_ENV=productionは、関連する設定ファイルIEでそれを参照するだけです。

# in config/servers/web.js
exports.production = { 
  servers: {
    web: function(api){
      return {
       port: process.env.PORT
      }
    }
  }
}

すごい。私の質問を読んでいないと思います。私の問題は、NODE_ENVをどのように使用するかではなく、どのように設定するかです。
dev.meghraj 2014

1
複数の環境プロパティを設定する場合は、npm startコマンドで設定しないでください。上記のスニペットを使用して、ENVポートを使用してサーバーを実行する場合は、次のようになりますexport PORT=1234; npm start。必要な数のENV宣言を追加できますが、それらはpackage.jsonファイルに属していません。それらが存在することを確認することが心配な場合は、設定ファイルでデフォルトを使用する必要があります:port: process.env.PORT || 8080
トニー

1
おそらく、これを説明する別の方法は、NODE_ENV(およびその他の環境変数)が環境の一部(したがって名前)であることです。これらは通常、アプリケーションではなく、アプリケーションを実行しているサーバーのプロパティです。実行するコマンドを使用して手動で設定できます。つまりNODE_ENV=test npm start、シェルで設定することもできます
Evan

3
同意しません。すべての環境で./configを使用すると、アプリをデプロイするときに静的環境を使用できます。これは古い哲学であり、必要なときに新しいタイプの環境を起動することはできません。必要な新しい環境ごとにIEを使用するには、.configを追加する必要があります。実行時に環境変数を設定することは、テックスタックがより高い柔軟性を必要とする場合に優れたオプションとなります。あなたの./configは環境の「タイプ」を設定するのに適していると思いますが、実行時にdsn文字列やAPIエンドポイントなどを定義できれば、アプリケーションはより柔軟になります。
Jesse Greathouse、2015

@JesseGreathouse-node.jsアプリケーションがあり、実行時に環境変数を設定する必要があります-どのファイルに設定しますか?
ロジャードジャー

1

npm(およびyarn)は package.jsonからスクリプトに環境変数として多くのデータを渡します。npm run envそれらをすべて見るために使用します。これは、https://docs.npmjs.com/misc/scripts#environmentに記載されており、「ライフサイクル」スクリプトだけでなくprepublishnpm run

これらの内部コード(process.env.npm_package_config_portJSなど)にアクセスできますが、スクリプトを実行しているシェルですでに使用できるため、次のようにアクセスすることもできます。$npm_...、「スクリプト」の拡張(UNIX構文、Windowsでは機能しない可能性がありますか?)。

「設定」セクションには、この使用することを目的と思われます。

  "name": "myproject",
  ...
  "config": {
    "port": "8010"
  },
  "scripts": {
    "start": "node server.js $npm_package_config_port",
    "test": "wait-on http://localhost:$npm_package_config_port/ && node test.js http://localhost:$npm_package_config_port/"
  } 

これらの「config」フィールドの重要な品質は、ユーザーがpackage.jsonを変更せずにそれらをオーバーライドできることです。

$ npm run start

> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port

Serving on localhost:8010

$ npm config set myproject:port 8020
$ git diff package.json  # no change!
$ cat ~/.npmrc
myproject:port=8020

$ npm run start

> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port

Serving on localhost:8020

npm configyarn config docsを参照してください。
その糸が読み込み表示されます~/.npmrcので、npm config set両方に影響しますが、yarn config setへの書き込み~/.yarnrc、これだけ糸がそれを見ることができます:-(


1

@lukeの答えは私が必要とするもののほとんどでした!ありがとう。

選択された回答は非常に単純(かつ正しい)ですが、古いので、スクリプトの実行時に.env個別のファイルから変数をインポートし、Lukeの回答に対するいくつかの制限を修正するための代替手段を提供したいと思います。これを試して:

::: .envファイル:::

# This way, you CAN use comments in your .env files
NODE_PATH="src/"

# You can also have extra/empty lines in it
SASS_PATH="node_modules:src/styles"

次に、パッケージjsonで、変数を設定して必要なスクリプトの前に実行するスクリプトを作成します。

::: package.json :::

scripts: {
  "set-env": "export $(cat .env | grep \"^[^#;]\" |xargs)",
  "storybook": "npm run set-env && start-storybook -s public"
}

いくつかの観察:

  • grepさ​​れたcatコマンドの正規表現は、コメントと空の行をクリアします。

  • &&する必要はありません。「糊付け」npm run set-envは、同じコマンドで変数を設定した場合、それは必要とされるであろうと、。

  • ヤーンを使用している場合、警告が表示される場合があります。変更するyarn set-envか、npm run set-env --scripts-prepend-node-path &&代わりに使用することができます。

異なる環境

使用する際のもう1つの利点は、さまざまな環境変数を使用できることです。

scripts: {
  "set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
  "set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}

キー、パスワード、または機密データ/個人データが含まれている場合は、gitリポジトリに.envファイルを追加しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.