Node.js(package.json)の「devDependencies」NPMモジュールのインストールをどのように防止しますか?


588

私はこれを私のpackage.jsonファイル(短縮版)に持っています:

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Mac 10.6.8でNPMバージョン1.1.1を使用しています。

プロジェクトルートから次のコマンドを実行するdependencies およびの両方がインストールされますdevDependencies

npm install

このコマンドがインストールされているという印象を受けましたdevDependencies

npm install --dev

どのように私はそれがそうさせるんnpm installのみインストールdependencies中のようなもの、(本番環境でのみこれらのモジュールを取得して)npm install --devインストールが両方dependenciesdevDependencies


1
ドキュメントによると、あなたは正しい、-devはdevdepsをインストールします。それ以外の場合はdepのみをインストールします。npmjs.org/doc/json.html。これは、少なくとも名前付きパッケージで機能することを知っています。
mna

1
2015年にこの質問に出くわした場合、-save-devスイッチはこの質問で質問されたとおりのトリックを実行します。
アナンド2015年

1
この回答stackoverflow.com/a/22004559/3718119は間の違いに素敵な説明を与えますdependenciesdevDependencies、それらのそれぞれが使用されています。
quasoft 2015

回答:


844

このnpm installコマンドは、開発環境(デフォルト)で、パッケージディレクトリ内で実行されるときにdevDependencies一緒にインストールdependenciesします。

使用npm install --only=prod(または--only=productionインストールする)だけで dependenciesはなく、devDependencies,関係なく、値のNODE_ENV環境変数。

出典:npm docs

注: NPM(2015年8月13日)のV3.3.0前に、オプションが呼び出された--production、すなわちnpm install --production


2
Agateの推論はおそらくdevDependenciesを削除して、パッケージをインストールするコンシューマーnpm install yourpackage.tgzがdevDependenciesも取得しないようにすることです。しかし、それはすでに事実です。以下のKevin Coxの回答を参照してください(stackoverflow.com/a/15826602/825588)。
ヨハン

5
npmjs.org/doc/cli/npm-install.html "デフォルトでは、npm installは依存関係としてリストされているすべてのモジュールをインストールします。--productionフラグを指定すると、npmはdevDependenciesにリストされているモジュールをインストールしません。"
tomByrer 2014

14
何てことだ。私はNODE_ENV=production自分がやっていることから完全に別のものを持っていて、npm install依存関係をインストールしない理由を私の人生で理解できませんでした。完全な回答をありがとう。
15

1
npm install --dev dev依存関係のみをインストールします
Rustem K

10
npm 3.3以降の場合:npm WARN install --devオプションの使用は非推奨です。--only=dev代わりに使用してください。
srcspider 2015年

232

私もその問題に遭遇します!npm installはやや混乱しており、明示的な「開発」インストールモードがあるかのように、Web投稿は-d /-devフラグを持ち込み続けます。

  • npm install依存関係」と「devDependencies」の両方をインストールします

  • npm install --production依存関係」のみをインストールします

  • npm install --devdevDependencies」のみをインストールします


29
警告:NODE_ENVがに設定されproductionて実行された場合、npm installdevの依存関係はインストールされません。私はDockerfileでこの問題に遭遇しました。
ヴォーン

1
@vaughan私もこれに遭遇しました、実行することで解決できますnpm --production=false install(これが--devフラグと一緒に機能するかどうかは不明です)
Bavell

138

新しいオプションは次のとおりです。

npm install --only=prod

devDependenciesのみをインストールする場合:

npm install --only=dev

1
これは反対の質問に答えます。OPは、devDependenciesをインストールしないように求めています。
musicin3d 2016年

2
あなたは部分的に正しい@ musicin3dです。そのため、最初の部分で、製品のみの依存関係をインストールする方法と、第2の部分で、開発のみの依存関係をインストールする方法について答えました。
Cloxure 16

5
ちょっと、そこ。@ user1614572がに関する部分を追加する前に、そのコメントを残しました--only=prod。あなた、先生、部分的に正しいです。; P
musicin3d 2016

展開に個別の依存関係を含めることができますか?
Jeeva Jsb

1
それはコメントであり、答えではありません。定期的にすべてのコメントをチェックするつもりはありません。何年も前から人々がコメントを更新するのを見たことがない。あなたは基本的にここに来て、私が私のコメントに1年を置いたことを批判しました。これ以上は応答しません。他の人をトローリングして楽しんでください。
ジャックジャック

47

2016年にこのPOSTを読んだ場合は、次のコマンドを使用して目的を達成してください

--only={prod[uction]|dev[elopment]} 

引数を指定すると、NODE_ENVに関係なく、devDependenciesのみまたは非devDependenciesのみがインストールされます。

から:https : //docs.npmjs.com/cli/install


なぜ「POST」を大文字にするのですか?docs.npmjs.com/cli/installには、との両方が明確に記載され--productionてい--only={prod[uction]|dev[elopment]}ます。
Dan Dascalescu、

33

すべての依存関係を既にインストールしていて、NPMから製品パッケージを再度ダウンロードする必要がないようにしたい場合は、次のように入力するだけです。

npm prune --production

これにより、dev依存関係がnode_modulesフォルダーから削除されます。これは、次のような2ステップのプロセスを自動化しようとしている場合に役立ちます。

  1. 開発依存関係を使用してプロジェクトをウェブパックする
  2. 本番モジュールのみを使用してDockerイメージをビルドする

npm prune間に実行すると、すべてを再インストールする必要がなくなります!


19

「npm install」を使用すると、モジュールは「devDependencies」または「dependencies」であるかどうかに関係なく、アプリケーション全体でロードされて使用可能になります。このアイデアの要約:package.jsonが依存関係(任意のタイプ)として定義するすべてのものは、node_modulesにインストールされます。

dependency / devDependencies / optionalDependenciesの違いの目的は、コードのコンシューマーがnpmを使用してこれらのリソースをインストールできることです。

ドキュメントごと:https : //npmjs.org/doc/json.html ...

プログラムでモジュールをダウンロードして使用することを計画している人は、おそらく、使用する外部テストまたはドキュメントフレームワークをダウンロードしてビルドすることを望まないか、必要としないでしょう。

この場合、これらの追加項目をdevDependenciesハッシュにリストするのが最善です。

これらのものは、-dev設定フラグが設定されるたびにインストールされます。このフラグは、npmリンクを実行するとき、またはパッケージのルートからnpmインストールを実行するときに自動的に設定され、他のnpm構成パラメーターと同様に管理できます。このトピックの詳細については、config(1)を参照してください。

ただし、この問題を解決するために、npmを使用して「依存関係」のみをインストールする場合は、次のコマンドを使用します。

npm install --production

これは、このフィルターを追加したGitコミットを確認することで確認できます(この機能を提供するために、他のいくつかのフィルター(以下にリスト)とともに)。

npmで使用できる代替フィルター:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr npm install --productionを使用してみてください


16

npmは、パッケージ内からインストールするときにdev依存関係をインストールします(package.json現在のディレクトリにがある場合)。別の場所(npmレジストリ、git repo、ファイルシステムの別の場所)からの場合は、依存関係のみをインストールします。


改めて教えていただけますか?かっこを間違えたと思います。早めに閉じたのを忘れたので、あなたのフレーズは私にはあまり意味がありません(英語を母国語としない人)。Rohan Singhの回答の下でのJohannのコメントは、私があなたの回答(私の疑いは瑪瑙の疑いとまったく同じだったため)に目を向けるように指摘し、成功しませんでした。どうnpm install some-moduleすればのdev依存関係をインストールできないのかわかりませんsome-module
Rafael Eyng、2015

ありがとう、修正しました。残りの質問は理解できません。
Kevin Cox

3

ノードアドオンを含むパッケージのdev依存関係をインストールしようとすると、単にdevDependenciesをインストールする場合でも、npm install --devの実行時にアドオンのビルドを回避できないことがわかりました。それで、私はnpmの後ろを回らなければなりませんでした:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

または、より良い(そしてより簡潔に)まだ、

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install

3

npm install packageName --saveこれを使用すると、パッケージが依存関係に追加されます。使用する場合npm install packageName --save-devは、devDependenciesです。

npm install packageName --save-dev開発目的でパッケージを追加するために使用する必要があります。TDDパッケージ(Chai、mochaなど)を追加するように。開発では使用され、本番では使用されません。


OPは中に問題が節約依存関係を持っていませんpackage.jsonが、これらの依存関係がすでに保存された後強制する方法を、次に、npm依存関係の1つの特定のタイプをインストールすることを。ここであなたの答えを読んだとき、私はOPによって引き起こされた問題を解決するのに役立つ何も知りませんでした。
Louis

3

NODE_ENV環境変数を使用して同じ結果を得ることができることは言及する価値があります。Nodeアプリケーション(Dockerなど)をコンテナ化する場合に特に役立ちます。

NODE_ENV=production npm install

上記のコードは、すべての依存関係をインストールしますが、開発依存関係(つまりdevDependencies)は依存関係になります。

Dockerfile詳細で環境変数を使用する必要がある場合は、こちらで確認できます

環境変数は必要に応じて簡単に上書きできます(たとえば、テストスイートを実行する場合はTravis CIで言う)。その場合は、次のようなことができます。

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

NPMドキュメントはこちら

製造

  • デフォルト:false
  • タイプ:ブール「本番」モードで実行するには、trueに設定します。

    1. 引数なしでローカルnpm installを実行すると、devDependenciesが最上位レベルにインストールされません。
    2. ライフサイクルスクリプトのNODE_ENV = "production"を設定します。

幸せなコンテナ化=)


3

使用することをお勧めしますnpm ci。(書いたように-なしでdevDependencies)実動に必要なパッケージのみをインストールする場合は、次のようにします。

npm ci --only=production

または

NODE_ENV=production npm ci

オールドスクールを好むならnpm install

npm install --production

または

NODE_ENV=production npm install

を使用する理由をここに示しますnpm ci


クールなnpm ciだけでなく、でも動作しnpm installます!
Klesun

2

選択した回答に追加する必要があります:現在npm install、パッケージディレクトリ(を含むpackage.json)ではdevDependenciesがインストールされますが、npm install -gインストールされません。


7
はい、-gインストールしませんdevDependenciesが、パッケージをグローバルにインストールします。これは、多くの場合意図した結果ではありません。
Bardi Harbourow 14

0

npm install --production本番に必要なノードモジュールをインストールする正しい方法です。詳細については、ドキュメントを確認してください


-1

npm 5+でpackage-lock.jsonを使用している場合、問題が発生します。を使用する前に削除する必要がありnpm install --productionます。


-1
npm install --dev will install dev dependencies

そして、依存関係のみをインストールする質問に従って、次のコマンドが役立ちます

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