web-dev-qa-db-ja.com

--saveと--save-devはどう違いますか?

違いは何ですか:

npm install [package_name] - 保存

そして

npm install [package_name] --save-dev

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

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

--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を使用するように求められます。

これが助けになり、明確になることを願っています。

502
Michael Bruce

デフォルトでは、NPMは単にnode_modulesの下にパッケージをインストールします。あなたがあなたのapp/moduleのために依存関係をインストールしようとしているとき、あなたは最初にそれらをインストールしそれからあなたのpackage.jsondependenciesセクションにそれらを追加する必要があるでしょう。

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

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

開発依存関係は、パッケージを開発するためにのみ必要とされる依存関係です。これにはテストランナー、コンパイラ、パッケージャなどが含まれます。どちらの種類の依存関係もパッケージのpackage.jsonファイルに格納されています。 --savedependenciesに追加され、--save-devdevDependenciesに追加されます

npm install ドキュメントはここで参照できます。

72

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

$ npm install TypeScript --save-dev

この場合は、TypeScript(JavaScriptで解析可能なコーディング言語)を開発用に用意することをお勧めしますが、アプリがデプロイされると、コードはすべてJavaScriptに変換されるため、必要なくなります。そのため、公開アプリに含めることは意味がありません。確かに、それはスペースをとり、ダウンロード時間を増やすだけです。

45
Jackalope

この回答 の@ andreas-hultgrenによると、 npm docs によると:

誰かがあなたのモジュールをダウンロードして自分のプログラムで使うことを計画しているなら、おそらく彼らはあなたが使う外部テストやドキュメンテーションフレームワークをダウンロードして構築することを望んでいないか、あるいは必要としません。

しかし、Webアプリケーション開発の場合、 Yeoman (査読済みの事前作成されたpackage.jsonファイルをインストールする足場ツール)はすべてのパッケージをdevDependenciesに配置し、依存関係には配置しません。少なくとも--save-devを使うことは webapp developmentで安全です。

32
wayfarer_boy

--save-devはパッケージ記述子ファイルの "devDependencies"配列にsemver仕様を保存し、--saveは代わりにそれを "dependencies"に保存します。

18
alex

例を挙げましょう。

  • あなたは非常にSERIOUSnpmlibraryの開発者です。さまざまなテストライブラリを使用してパッケージをテストします。
  • ユーザーがライブラリをダウンロードし、自分のコードで使用したい。テストライブラリもダウンロードする必要がありますか?たぶん、テストにはjestを使用し、mochaを使用します。 jestもインストールしますか?あなたのライブラリを実行するだけですか?

権利はありません? devDependenciesにあるのはそのためです。

誰かがそうすると、npm i yourPackageRUNに必要なライブラリのみがインストールされます。

なぜ開発者はdevDependanciesを公開する必要がありますか?

あなたのパッケージがオープンソースパッケージであり、何百人もの人々があなたのパッケージにプルリクエストを送信しているとしましょう。次に、彼らはどのようにパッケージをテストしますか?彼らはgit cloneあなたのレポとnpm iを行うとき依存関係とdevDependenciesを行います。彼らはあなたのパッケージを使用していないからです。パッケージをさらに開発しているため、devDependenciesが必要です。

5

--save-dev は、アプリケーションの開発に使用されるモジュールに使用されます。本番環境での実行中は不要です。 --save はpackage.jsonに追加するために使用され、実行には必要です。アプリケーションの。

例:express、body-parser、lodash、helmet、mysqlこれらはすべてアプリケーションの実行中に使用されます - 開発時にはmocha、istanbul、chai、sonarqube-scannerのすべてが使用されます。依存関係.

npm linkまたはnpm installを実行すると、プロジェクトフォルダーに依存関係モジュールとともにdev依存関係モジュールもインストールされます。

4
BittuS

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

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

参照してください: https://docs.npmjs.com/cli/install

4
Alireza

開発目的のためだけに使用しようとしているものでプロダクションパッケージを肥大化させたくはありません。

単体テストフレームワーク(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"
},
3
velhala

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

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

たとえば、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だけです

概要:

  1. 誰かがあなたのコードをコンパイルしたい(ライブラリとして使う)場合は、あなたのコードで使われているlodashdependenciesに入れてください。

  2. 誰かがあなたのコードにもっと機能を追加したいのなら、彼はunit testcompilerを必要とします。それらをdev-dependenciesに入れてください。

0
toffee

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 リストにも追加されます。

0
hakiko

邪悪なクールなことをするためにプロダクションにnpmを使う人がいます。Node.jsはその一例です。したがって、開発ツールをすべて実行したくないのです。

もしあなたがgulp(あるいは同様のもの)を使ってあなたのサーバーに置くためのビルドファイルを作成しているのであれば、それは大した問題ではありません。

0
Tristanisginger