概要
環境構築時にnpmのモジュールを他の開発者と同じようにインストールするために下記のコマンドを使ってnodemoduleをインストールするは鉄則のようなものかと思います。
npm install
, npm ci
, npm i
ですが「。。。ん?そういえば環境構築のREADME.mdいつもコピペしてて、こんなのよく出てたけどこれらの違いってよくわからないな。。?」
ということで記事を書きます。
いまだに間違った理解をしている可能性も十分にあるので、その場合は訂正コメントをお願いします!
npm install vs npm i
npm install = npm i
省略記法です。
これからはnpm install
をnpm iと書き換えて説明します。
npm i vs npm ci
npm iは何をしているのか
package.jsonを基に、npmでパッケージをインストールする。
package.jsonってなんだ
簡単に言うと何を入れたいかが書いてあります。
インストールすべきパッケージのバージョンの範囲が記載されています。
→範囲なのでgit clone
してnpm i
しても、実際にインストールしたパッケージが他の開発者と異なる場合があります。
プロジェクト序盤でnpm init
をすることで、作成されます。
npm ci は何をしているのか
package-lock.jsonを基に、npmでパッケージをインストールするコマンドです。
下記を実行しています
- node_modules ディレクトリの削除
- package-lock.json と package.json の整合性のチェック。違ったらエラーを吐く。
- package-lock.json から node_modules を再現
ちなみに処理はいくつかの機能を省略するので、npm install
より圧倒的に高速な場合があります。
package-lock.jsonってなんだ
簡単に言うと何を実際に入れたが書いてあります。
npmが依存関係など考慮して、実際にインストールしたパッケージのバージョンが記載されています。
大まかな流れ
npm init
→package.json作成
↓
npm install <package>
→指定したパッケージをインストール
→インストールしたパッケージのバージョン範囲をpackage.jsonに自動で記述
→package-lock.json作成・実際にインストールしたバージョンを記述
↓
npm install
→他の開発者がpackage.jsonをもとにインストール
OR
npm ci
→他の開発者がpackage-lock.jsonをもとにインストール
結論
package.jsonは何をインストールするか、package-lock.jsonは何をインストールしたかが記載されています。
npm ci
ではpackage-lock.jsonに基づいてパッケージをインストールします。
npm i
ではpackage.jsonに基づいてパッケージをインストールします。
CI 実行時や git clone 後の動作確認の場合はnpm ci
その他の場合はnpm i
で分ける感じかと思います。
環境構築時にnpm i
を使うと、他の開発者の環境とまったく同じではない環境ができる可能性があり、レポジトリをpushする際にも毎回差分を削除する必要などが出てくるため、今回のようなケースではnpm ci
が推奨されています。インストールのスピードも速いです。