はじめに
Node.jsの世界で開発をしていると、避けて通れないのがnpm(Node Package Manager)です。npmは、JavaScriptのパッケージ管理ツールとして広く使われており、プロジェクトの依存関係を管理する上で欠かせない存在です。
特にnpm install
コマンドは、エンジニアであれば馴染み深いコマンドかと思います。
今回はnpm install
(npm i)コマンドと似ているnpm ci
コマンドについて記事にしました。
npm i
とは
npm i
はnpm install
の略称で、Node.jsプロジェクトの依存関係をインストールするためのコマンドです。
npm i
は、npm install
の略称として機能します。
また、npm i <パッケージ名>
のように特定のパッケージをインストールすることも可能です。
$ npm i
コマンド実行をすると、package.json
ファイルを読み込み、必要なパッケージをnode_modules
ディレクトリにインストールします。
npm ci
とは
npm ci
はnpm clean-install
の略で、こちらも同じくNode.jsプロジェクトの依存関係をインストールするためのコマンドです。
$ npm ci
こちらはnpm version 5.7.0で導入され、プロジェクトの依存関係をより厳密に管理するために誕生したそうです。
また、npm ci
は通常、npm i
よりも高速に動作します。
npm i
とnpm ci
の違いは?
npm i
はpackage.json
の内容に基づいて依存関係を解決するのに対し、
npm ci
は、package-lock.json
に厳密に従います。
つまりnpm ci
は、開発環境間での一貫性を保つのに役立つコマンドとなります。
特に、実務やチーム開発の場面ではnpm ci
は重宝します。
npm ci
はpackage-lock.json
を厳密に遵守するため、全てのチームメンバーが同一の依存関係バージョンを使用することを保証します。
また、package.json
とpackage-lock.json
の一致を要求するため、意図しないバージョンアップによる競合を防ぐことができます。
そのため、「自分の環境では動くのに、他の人の環境では動かない」といった問題を大幅に削減することができます。
不一致が発生した場合にエラーを吐いてくれるのも大きいですね。
npm ERR! The package-lock.json file was created with an old version of npm,
npm ERR! so supplemental metadata must be fetched from the registry.
npm ERR!
npm ERR! sha512-mismatch for https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz
npm ERR! Fetched package: sha512-3Uh8m0vGmTPIUiSiP2pPZOzXc+KSfkTB3GUEWAzwX5VcPCXXrA8Ung2KAmQkVJ53ZrWVPuPkPR1YKPzrHNZdA==
npm ERR! Manifest: sha512-1/AbfjdKhHUd5ZQ7YRWKZ2rCRYWtm7EGZFn3Pk3h7OXS7Q3TuGKfnC/V9N5OCt6M0z28Pzp2Oj7NGEWj8QwLg==
npm ci
のデメリットは?
より厳密にインストールを行う為、柔軟性の欠如や、開発中の依存関係管理の難しさなどが挙げられるかと思います。
個人開発のシーンでは使用する機会は少ないかと思います。
また、npm ci
は個別のパッケージをインストールすることはできません。(常にプロジェクト全体をインストールします。)
まとめ
今回は類似コマンドのnpm i
とnpm ci
について簡単にまとめました。
もしnpmの依存関係でエラーが発生した際には、ぜひnpm ci
を試してみてはいかがでしょうか。