--saveと--save-devの違いは何ですか?


747

違いは何ですか:

npm install [package_name] --save

そして:

npm install [package_name] --save-dev

これは何を意味するのでしょうか?


4
ええ、私はこれについて混乱しています-Jenkinsのような継続的インテグレーションを使用する場合、Jenkinsはテストを実行するためにdevDependenciesモジュールを使用することを知っていますか?私はそう思いますが、それは超明白ではありません。
Alexander Mills

5
おそらく質問を編集して、依存関係とdevDependenciesの機能的な違いは何ですか?
Alexander Mills

5
--save-devオプションを介してインストールされたパッケージは、ユーザーが実行したときに再インストールされませんnpm install --production。これが操作上の違いです(詳細については、https://docs.npmjs.com/cli/installを参照してください)。
Andrew

7
@MuhammadUmerそれがまさに人々がここで質問をする理由です-「手掛かりを得るために」。おそらく、本当の答えを追加する方が生産性が高くなるでしょう-これは、私が知らなかった興味深い違いです。
Simon_Weaver

3
また、環境変数NODE_ENVを本番に設定すると、 npm install開発パッケージが自動的に除外されます。
ムハンマドウメール

回答:


591
  • --save-dev開発目的でパッケージを保存するために使用されます。例:単体テスト、縮小。
  • --save アプリケーションの実行に必要なパッケージを保存するために使用されます。

150
それらはどう違いますか?どちらを使用するのですか?--save-devの下にある場合でも、本番環境でパッケージを使用できますか?
Dave Voyles、2016年

14
答えは最初の2つの質問に簡潔に答えます。「--save-devの下にあるパッケージを本番環境で使用できますか?」という最後の質問への答えは「いいえ」です。これを行うことは確かに可能ですが、それは意図されていません。
Technetium 2017年

61
速記のバージョン:-Dの略である--save-dev-Sするために短いです--save
chrisco

164
この答えはイライラするほどあいまいです。小さな例でも、これをより明確にするのに役立つでしょう。
Choylton B. Higginbottom 2017

33
npmバージョン5.0.0以降、この--saveオプションは不要になったことに注意してください。実行するnpm install my-packageと、package.jsonファイルに依存関係として「my-package」が追加されます。
マーティンカレル

644

独自のプロジェクトで両方を試した場合、--saveとの違いは--save-devすぐにはわかりません。だからここにいくつかの例があります...

日付を解析して表示するためにモーメントパッケージを使用するアプリを作成していたとしましょう。アプリはスケジューラなので、実際にこのパッケージを実行する必要があります。例:これなしでは実行できません。この場合、使用します

npm install moment --save

これにより、package.jsonに新しい値が作成されます

"dependencies": {
   ...
   "moment": "^2.17.1"
}

開発中は、テストスイートなどのツールを使用すると非常に役立ち、jasmine-corekarmaが必要になる場合があります。この場合、使用します

npm install jasmine-core --save-dev
npm install karma --save-dev

これにより、package.jsonに新しい値も作成されます

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

あなたはない必要はありません、それがあるので、通常の状態でアプリを実行するために、テストスイートを--save-devタイプ依存性、より多くの何もありません。実際に何が起こっているのかを理解していないと、想像するのが少し難しいです。

NPM docs docs#dependenciesから直接取得

依存関係

依存関係は、パッケージ名をバージョン範囲にマップする単純なオブジェクトで指定されます。バージョンの範囲は、1つ以上のスペースで区切られた記述子を持つ文字列です。依存関係は、tarballまたはgit URLでも識別できます。

依存関係オブジェクトにテストハーネスまたはトランスパイラーを配置しないでください。以下のdevDependenciesを参照してください

ドキュメントでも、テストハーネスなどのモジュールには--save-devを使用するように求められます。

これが役に立って明確であることを願っています。


15
IMO、 'save'キーワードが問題だと思います。開発用に-devフラグを、デプロイ用に-deployを作成しないのはなぜですか。「保存」キーワードより意味があります。
Thinh Vu 2017

1
パッケージがリリースパッケージであるか、開発パッケージであるか、そして--saveが両方で使用されているかをパッケージが認識(決定)しないのはなぜですか。パッケージ開発者がインテントを作成するときに、インストールしているユーザーにこれを決定させるのは奇妙に思えます。
CodeGrue 2017年

4
CodeGrue、jQueryをReactコンポーネントのテストのみに使用する場合は、save-devに入りますが、メインプロジェクトのビルドに実際に使用することはできません。はい、可能です。それで、なぜパッケージャーはあなたがそれで何をしているのか知っているのですか?
マイケルブルース

2
はるかに明確。私は、Bootstra + Node.jsワークフローを初めて学習する組み込みの人です。違いが何であるかは明らかではありません。
Leroy105 2018年

3
@YakovL save-devは、誰かが依存関係としてパッケージをインストールしても、パッケージがインストールされないことを意味します。start / buildなどのスクリプトを実行するためだけに使用されるパッケージは、その場合は必要ないため、dev-dependencyに置かれます。他の人が使用するパッケージではなくWebアプリで作業している場合は、おそらくそれについて心配する必要はありません。
riv

111

デフォルトでは、NPMは単にnode_modulesの下にパッケージをインストールします。アプリ/モジュールの依存関係をインストールする場合は、まずそれらをインストールしてから、のdependenciesセクションに追加する必要がありますpackage.json

--save-devサードパーティパッケージをパッケージの開発依存関係に追加します。誰かがあなたのパッケージをインストールするとき、それはインストールされません。通常、誰かがソースリポジトリを複製して実行npm installした場合にのみインストールされます。

--saveサードパーティパッケージをパッケージの依存関係に追加します。これは、誰かが実行するたびにパッケージと一緒にインストールされますnpm install package

Devの依存関係は、パッケージの開発にのみ必要な依存関係です。これには、テストランナー、コンパイラ、パッケージャなどが含まれます。両方の種類の依存関係がパッケージのpackage.jsonファイルに格納されます。--saveに追加dependencies、に--save-dev追加devDependencies

npmインストールドキュメントはここで参照できます。


37
私はこれを疑っています...他の人と共有するパッケージを開発している場合、パッケージにならない、つまりnpmからダウンロードされないWebアプリを構築している場合は、-save-devと--saveを交換可能に使用できます。違いを理解することが重要です。
VFein 2017年

13
最後に、npm installを使用するときにその目的を述べた人に感謝します
CapturedTree

3
--saveは、2017年のnpm 5のリリースでnpmインストールでデフォルトになりました
NattyC '11 / 07/19

待って、なぜ複雑な文なの?DevDependecyでは、開発者はパッケージをインストールでき、devDevependencyのみが更新されます。そのため、新しい開発者がプロ​​ジェクトコードベースを複製し、npm install => here dependency package name is going to install.をnode_modules .. でのみ実行すると、Dev-dependencyのような開発者のパッケージではありません。
Anupam Maurya

60

この完璧な例は次のとおりです。

$ npm install typescript --save-dev

この場合、開発にTypescript(javascriptで解析可能なコーディング言語)を利用できるようにする必要がありますが、アプリがデプロイされると、すべてのコードがjavascriptに変換されているため、不要になります。そのため、公開されたアプリに含めても意味がありません。実際、それはスペースを占有し、ダウンロード時間を増加させるだけです。


4
同じことが「$ npm install grunt --save-dev」にも当てはまります。開発には役立ちますが、デプロイメントには役立ちません。
ジャッカロープ2017年

1
補足:Microsoftは、devDependenciesではなく@ types / xxxパッケージを依存関係としてインストールすることを推奨していますgithub.com/Microsoft/types-publisher/issues/81
Dave

2
私が混乱しているのは、これがどのように問題になるのかということです。を使用し--saveて保存されたパッケージは、引き続きnode_modulesフォルダにのみ保存されます。コードはデプロイされたWebサイトに含まれていません。
ココドコ

6
@Kokodoko --save-devフラグを使用すると、パッケージがdevDependenciesオブジェクトに追加されます。誰かがパッケージをインストールすると、すべてdependenciesがダウンロードされますが、devDependencies実行時に必要とされないため、ダウンロードされません。答えが述べたように、これは彼らに時間とスペースを節約します。パッケージファイル自体に取り組んでいる開発者npm installは、パッケージディレクトリ内で実行してをインストールすることdevDependenciesもできます。
Jasjit Singh Marwah 2018

githubからリポジトリをダウンロードしてと入力npm installしてdevDependenciesも無視されますか?
ココドコ2018年

41

例を挙げましょう。

  • あなたは非常に深刻な npm ライブラリの開発者です。異なるテストライブラリを使用してパッケージをテストします。
  • ユーザーがライブラリをダウンロードし、コードで使用したいと考えています。テストライブラリもダウンロードする必要がありますか?多分あなたjestはテストに使用し、彼らは使用しますmocha。それらもインストールjestしますか?ライブラリを実行するだけですか?

権利はありません?それが彼らがにdevDependenciesいる理由です。

誰かがいた場合、npm i yourPackageするために必要なだけのライブラリRUNあなたのライブラリがインストールされます。コードをバンドルしたり、テストやモックに使用した他のライブラリは、それらをに配置するため、インストールされませんdevDependencies。かなりすっきりしましたか?

では、なぜ開発者はdevDependanciesを公​​開する必要があるのですか?

あなたのパッケージがオープンソースのパッケージであり、何百人もの人があなたのパッケージにプルリクエストを送信しているとしましょう。次に、どのようにパッケージをテストしますか?彼らは意志git cloneあなたのレポとするとき、彼らはどうなるの依存関係だけでなく、devDependenciesを。 彼らはあなたのパッケージを使用していないからです。彼らはパッケージをさらに開発しているため、パッケージをテストするために、既存のテストケースに合格するだけでなく、新しいテストケースも作成する必要があります。したがって、彼らはあなたが使用したすべてのテスト/ビルド/モッキングライブラリを含むあなたを使用する必要があります。npm i
devDependencies


8
受け入れられた回答や最大投票数の回答よりもはるかに優れています。この回答の方が実際にはより実用的だからです。ありがとう!
捕捉されなかった例外

これが選択された答えになるはずです。他のすべての回答は、実際にどちらを使用するのかを説明していません。
ロッキーケフ

34

この回答で@ andreas-hultgrenによって提案され、npm docsによると:

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

しかし、Webアプリケーション開発のために、ヨーマンの使用がことが表示されますので、(とりわけ査読、事前に書面によるpackage.jsonファイルをインストール足場ツール)は、devDependenciesと依存関係にある何のすべてのパッケージを置く--save-dev安全な賭けでありますでWebアプリケーションの開発、少なくとも。


3
gulpを使用してパッケージをインストールするとき--save-devに、パッケージが必要な依存関係をインストールしない場合に問題が発生することに注意してください。実行--saveすると、不足している依存関係がインストールされます。
Nick M

18
また--save、テストとドキュメントの依存関係を除いてすべて使用していることにも注意してください(npm docsによる)。上で述べたヨーマンの例は、ベストプラクティスの良い例ではないと思い始めています。
wayfarer_boy 2015

私もそう思う、なぜあなたが必要とするのかは、--save-devここでのすべての答えで明らかにならないだけです:)
ココドコ

20

--save-devsemver specをパッケージ記述子ファイルの「devDependencies」配列に--save保存し、代わりに「dependencies」に保存します。


83
そして機能的な違いは何ですか?
ahnbizcad 2015

6
この答えは私にとって最も理にかなっています。開発にはdevDependenciesが必要ですが、本番環境には必要ありません。したがって、htmllint、sassコンパイルなどとDependenciesは、実行するために存在する必要があるDiaporamaなどの本番要件にあります。
ゴリラを製粉する

3
@ahnbizcad答えはこちらですが、主な機能上の違いは、devDependenciesが推移的に含まれていないことです。
ペース2016

これをまだ知らない人のために説明する最も直観的な方法はこれではありませんか?:開発--save-devはパッケージをプロジェクトに--saveローカルにしますが、ノードのインストールにローカルにしますか?
ahnbizcad 2016

9

明確な答えはすでに提供されています。しかし、devDependenciesパッケージのインストールにどのように影響するかについて言及する価値があります。

デフォルトでは、npm installはpackage.jsonに依存関係としてリストされているすべてのモジュールをインストールします。--productionフラグを指定した場合(またはNODE_ENV環境変数がproductionに設定されている場合)、npmはdevDependenciesにリストされているモジュールをインストールしません。

参照:https : //docs.npmjs.com/cli/install


8

一般的に、開発目的でのみ使用することを意図したもので本番パッケージを膨らませたくありません。

単体テストフレームワーク(jest、jasmine、mocha、chaiなど)などのパッケージを分離するには、--save-dev(または-D)オプションを使用します。

アプリが本番環境で必要とする他のパッケージは、--save(または-S)を使用してインストールする必要があります。

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

package.jsonファイルを開くと、これらのエントリが2つの異なるセクションの下に一覧表示されます。

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},

5

--save-devのはアプリケーションの開発に使用されるモジュールのために使用されている、いない生産envionmentの中でそれを実行しながら、必要 --save package.jsonにそれを追加するために使用され、それがアプリケーションの実行に必要です。

例:express、body-parser、lodash、helmet、mysqlこれらはすべて、アプリケーションの実行中に使用されます--saveを使用して依存関係を配置し、開発中にmocha、istanbul、chai、sonarqube-scannerがすべて使用されるため、それらをdevに配置します-依存関係。

npm linkまたはnpm installは、プロジェクトフォルダー内の依存関係モジュールと共にdev-dependencyモジュールもインストールします


3

ここでの説明はすべてすばらしいですが、非常に重要なことを欠いています。プロダクションの依存関係のみをどのようにインストールしますか?(開発の依存関係なし)。またはを使用してdependenciesから分離します。使用するすべてをインストールするには:devDependencies--save--save-dev

npm i

プロダクションパッケージのみをインストールするには、次を使用します。

npm i --only=production

0

自分のアイデアをいくつか追加したい

誰かが自分でコードを使用するのではなく、コードを使用すると、すべての違いが現れると思います

たとえば、次のHTTPライブラリを作成します。 node's request

あなたのライブラリでは、

lodashを使用して文字列とオブジェクトを処理しましたが、lodashがないと、コードを実行できません

誰かが自分のコードの一部としてHTTPライブラリを使用した場合。あなたのコードは彼と一緒にコンパイルされます。

あなたに置く必要があるので、あなたのコードは、lodashが必要dependenciesコンパイル


monaco-editorWebエディターであるのようなプロジェクトを作成すると、

すべてのコードとproduct env library使用するWebpackをバンドルし、ビルドが完了すると、monaco-min.js

誰かがケースないようにするかどうか--save--save-dependencies、彼だけは、ISを必要としますmonaco-min.js

概要:

  1. コードをコンパイルしたい(ライブラリとして使用したい)場合はlodash、コードで使用したものをdependencies

  2. 誰かがあなたのコードにもっと機能を追加したいなら、彼はunit testそれを必要としcompiler、そしてこれらをdev-dependencies


0

人々はプロダクションでnpmを使用して邪悪なクールなことをします。Node.jsはその一例です。そのため、すべての開発ツールを実行する必要はありません。

サーバーに配置するビルドファイルを作成するためにgulp(または類似の)を使用している場合、それは本当に重要ではありません。

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