違いは何ですか:
npm install [package_name] - 保存
そして
npm install [package_name] --save-dev
これは何を意味するのでしょうか?
--save-dev
は開発目的でパッケージを保存するために使用されます。例:単体テスト、縮小.--save
は、アプリケーションの実行に必要なパッケージを保存するために使用されます。--save
と--save-dev
の違いは、自分のプロジェクトで両方を試した場合、すぐには気付かないかもしれません。ここにいくつかの例があります...
momentパッケージを使用して日付を解析および表示するアプリを構築しているとしましょう。アプリはスケジューラーなので、このパッケージを実行するには本当に必要です:それなしでは実行できません。この場合、使用します
npm install moment --save
これにより、package.jsonに新しい値が作成されます。
"dependencies": {
...
"moment": "^2.17.1"
}
開発中は、テストスイートなどのツールを使用すると非常に役立ち、 jasmine-core および karma が必要になる場合があります。この場合、使用します
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#dependencies
依存関係
依存関係は、パッケージ名をバージョン範囲にマップする単純なオブジェクトで指定されます。バージョン範囲は、1つ以上のスペースで区切られた記述子を持つ文字列です。依存関係は、tarballまたはgit URLで識別することもできます。
依存関係オブジェクトにテストハーネスやトランスパイラーを置かないでください。以下のdevDependenciesを参照してください。
ドキュメントでも、テストハーネスなどのモジュールに--save-devを使用するように求められます。
これが助けになり、明確になることを願っています。
デフォルトでは、NPMは単にnode_modulesの下にパッケージをインストールします。あなたがあなたのapp/moduleのために依存関係をインストールしようとしているとき、あなたは最初にそれらをインストールしそれからあなたのpackage.json
のdependencies
セクションにそれらを追加する必要があるでしょう。
--save-dev
は、サードパーティパッケージをパッケージの開発依存関係に追加します。誰かがあなたのパッケージをインストールしたときにはインストールされません。通常、誰かの clone あなたのソースリポジトリにインストールされ、その中でnpm install
が実行されている場合にのみインストールされます。
--save
は、サードパーティパッケージをパッケージの依存関係に追加します。誰かがnpm install package
を実行する時はいつでもパッケージと一緒にインストールされます。
開発依存関係は、パッケージを開発するためにのみ必要とされる依存関係です。これにはテストランナー、コンパイラ、パッケージャなどが含まれます。どちらの種類の依存関係もパッケージのpackage.json
ファイルに格納されています。 --save
はdependencies
に追加され、--save-dev
はdevDependencies
に追加されます
npm install ドキュメントはここで参照できます。
この完璧な例は次のとおりです。
$ npm install TypeScript --save-dev
この場合は、TypeScript(JavaScriptで解析可能なコーディング言語)を開発用に用意することをお勧めしますが、アプリがデプロイされると、コードはすべてJavaScriptに変換されるため、必要なくなります。そのため、公開アプリに含めることは意味がありません。確かに、それはスペースをとり、ダウンロード時間を増やすだけです。
この回答 の@ andreas-hultgrenによると、 npm docs によると:
誰かがあなたのモジュールをダウンロードして自分のプログラムで使うことを計画しているなら、おそらく彼らはあなたが使う外部テストやドキュメンテーションフレームワークをダウンロードして構築することを望んでいないか、あるいは必要としません。
しかし、Webアプリケーション開発の場合、 Yeoman (査読済みの事前作成されたpackage.jsonファイルをインストールする足場ツール)はすべてのパッケージをdevDependenciesに配置し、依存関係には配置しません。少なくとも--save-dev
を使うことは webapp developmentで安全です。
--save-dev
はパッケージ記述子ファイルの "devDependencies"配列にsemver仕様を保存し、--save
は代わりにそれを "dependencies"に保存します。
例を挙げましょう。
jest
を使用し、mocha
を使用します。 jest
もインストールしますか?あなたのライブラリを実行するだけですか?権利はありません? devDependencies
にあるのはそのためです。
誰かがそうすると、npm i yourPackage
RUNに必要なライブラリのみがインストールされます。
なぜ開発者はdevDependanciesを公開する必要がありますか?
あなたのパッケージがオープンソースパッケージであり、何百人もの人々があなたのパッケージにプルリクエストを送信しているとしましょう。次に、彼らはどのようにパッケージをテストしますか?彼らはgit clone
あなたのレポとnpm i
を行うとき依存関係とdevDependenciesを行います。彼らはあなたのパッケージを使用していないからです。パッケージをさらに開発しているため、devDependenciesが必要です。
--save-dev は、アプリケーションの開発に使用されるモジュールに使用されます。本番環境での実行中は不要です。 --save はpackage.jsonに追加するために使用され、実行には必要です。アプリケーションの。
例:express、body-parser、lodash、helmet、mysqlこれらはすべてアプリケーションの実行中に使用されます - 開発時にはmocha、istanbul、chai、sonarqube-scannerのすべてが使用されます。依存関係.
npm linkまたはnpm installを実行すると、プロジェクトフォルダーに依存関係モジュールとともにdev依存関係モジュールもインストールされます。
明確な答えはすでに提供されています。しかし、devDependencies
がパッケージのインストールにどのように影響するかを言及する価値があります。
デフォルトでは、npm installはpackage.jsonに依存関係として記載されているすべてのモジュールをインストールします。 --productionフラグを指定した場合(または、NODE_ENV環境変数がproductionに設定されている場合)、npmはdevDependenciesにリストされているモジュールをインストールしません。
参照してください: https://docs.npmjs.com/cli/install
開発目的のためだけに使用しようとしているものでプロダクションパッケージを肥大化させたくはありません。
単体テストフレームワーク(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"
},
私のアイデアをいくつか追加したい
誰かが自分で使うのではなく自分のコードを使うと、すべての違いが現れると思います
たとえば、node's request
というHTTPライブラリを作成したとします。
あなたの図書館では、
あなたは、lodashを使わずに文字列とオブジェクトを扱うためにlodashを使いました。
誰かがあなたのHTTPライブラリを彼のコードの一部として使っているなら。あなたのコードは彼と一緒にコンパイルされます。
あなたのコードはlodashを必要とするので、あなたは compile にdependencies
を入れる必要があります。
Webエディタであるmonaco-editor
のようなプロジェクトを書くと、
あなたはすべてのコードとあなたのproduct env library
をwebpackを使ってバンドルしていて、ビルドが完了した時にはmonaco-min.js
しか持っていません。
それで誰かが--save
か--save-dependencies
かどうかを主張せず、必要なのはmonaco-min.js
だけです
概要:
誰かがあなたのコードをコンパイルしたい(ライブラリとして使う)場合は、あなたのコードで使われているlodash
をdependencies
に入れてください。
誰かがあなたのコードにもっと機能を追加したいのなら、彼はunit test
とcompiler
を必要とします。それらをdev-dependencies
に入れてください。
npm installは、指定されたパッケージをデフォルトで依存関係に保存します。さらに、いくつかの追加フラグを使用して、保存場所と保存方法を制御できます。
-P, --save-prod:
パッケージはあなたの依存関係の中に現れます。 -D
または-O
が存在しない限り、これがデフォルトです。
-D, --save-dev:
パッケージはあなたの devDependencies に現れるでしょう。
-O, --save-optional:
パッケージはあなたの optionalDependencies に現れるでしょう。
--no-save:
依存関係 への保存を防ぎます。
package.json への依存関係を保存するために上記のオプションのいずれかを使用する場合、2つの追加のオプションのフラグがあります。
-E, --save-exact:
保存された依存関係は、npmのデフォルトのsemver range演算子を使うのではなく、正確なバージョンで設定されます。
-B, --save-bundle:
保存された依存関係はあなたの bundleDependencies リストにも追加されます。
邪悪なクールなことをするためにプロダクションにnpmを使う人がいます。Node.jsはその一例です。したがって、開発ツールをすべて実行したくないのです。
もしあなたがgulp(あるいは同様のもの)を使ってあなたのサーバーに置くためのビルドファイルを作成しているのであれば、それは大した問題ではありません。