# npm i と npm ci の違いと使い分け
npm install(npm i)とnpm ciの使い分けメモ。適切に使い分けることで、開発効率を向上させ、本番環境での予期しない問題を防げる。
# npm install (npm i) とは
npm install(短縮形:npm i)は、npmパッケージをインストールする最も一般的なコマンド。柔軟性が高く、開発環境で頻繁に使用する。
# npm install の特徴
# package-lock.json を更新する
npm installを実行すると、package-lock.jsonが存在する場合でも、依存関係の解決結果に応じて更新される可能性がある。
# package-lock.jsonが更新される可能性がある
npm install express@latest
# 柔軟な依存関係解決
package.jsonのバージョン範囲(^、~など)に基づいて、利用可能な最新バージョンがインストールされる。
{
"dependencies": {
"express": "^4.18.0" // 4.18.0以上、5.0.0未満の最新版がインストールされる
}
}
# node_modules の既存構造を保持
既存のnode_modulesディレクトリがある場合、可能な限り既存の構造を保持しながらインストールする。
# 開発時の利便性
新しいパッケージを追加したり、バージョンを更新したりする際に便利。
# npm ci とは
npm ci(Clean Install)は、CI/CD環境や本番環境での使用を想定した、より厳密で高速なインストールコマンド。package-lock.jsonに完全に従ってインストールを行う。
# npm ci の特徴
# package-lock.json が必須
npm ciはpackage-lock.jsonが存在しない場合、エラーで終了する。
# package-lock.jsonがない場合
npm ci
# エラー: npm ci can only install packages when your package.json and package-lock.json are in sync
# package-lock.json を更新しない
npm ciはpackage-lock.jsonを読み取り専用として扱い、一切更新しない。
# node_modules を完全に削除して再構築
既存のnode_modulesディレクトリを完全に削除してから、一から再構築する。これにより、一貫性の高いインストールが保証される。
# npm ciの実行イメージ
# 1. node_modulesを削除
# 2. package-lock.jsonに基づいて一からインストール
# 3. 厳密にバージョンをチェック
# 厳密なバージョンチェック
package.jsonとpackage-lock.jsonの内容が一致しない場合、エラーで終了する。
# package.jsonとpackage-lock.jsonが不一致の場合
npm ci
# エラー: The package-lock.json file needs to be updated
# 高速なインストール
node_modulesを削除して再構築するため、キャッシュの不整合による問題を防ぎ、高速にインストールできる。
# npm i と npm ci の比較
| 項目 | npm install (npm i) | npm ci |
|---|---|---|
| package-lock.json | 更新される可能性がある | 必須、更新しない |
| node_modules | 既存構造を保持 | 完全削除して再構築 |
| 速度 | やや遅い(差分更新) | 高速(一から構築) |
| 厳密性 | 柔軟(バージョン範囲を許容) | 厳密(完全一致を要求) |
| エラーハンドリング | 警告のみで続行 | エラーで終了 |
| 使用場面 | 開発環境 | CI/CD、本番環境 |
| package.json不一致 | 警告のみ | エラーで終了 |
# 使い分けのガイドライン
# 開発環境では npm install を使用
開発中は、新しいパッケージを追加したり、バージョンを更新したりする必要があるため、npm installを使用する。
# CI/CDや本番環境では npm ci を使用
CI/CDパイプラインや本番環境では、再現性と一貫性が重要。npm ciを使用することで、常に同じバージョンのパッケージがインストールされる。
# チーム開発での推奨事項
package-lock.jsonをGitにコミットする
- チーム全体で同じバージョンのパッケージを使用するため
package-lock.jsonは必ずバージョン管理に含める
開発者はnpm installを使用
- 新しいパッケージを追加する際
- パッケージを更新する際
CI/CDではnpm ciを使用
- 自動テストやデプロイ時に使用
- 一貫性を保証するため
# package.json と package-lock.json の関係
# package.json
package.jsonは、プロジェクトの依存関係を範囲指定で定義する。
{
"name": "my-project",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.0",
"axios": "~1.4.0"
}
}
^4.18.0: 4.18.0以上、5.0.0未満の最新版~1.4.0: 1.4.0以上、1.5.0未満の最新版
# package-lock.json
package-lock.jsonは、実際にインストールされた正確なバージョンを記録する。
{
"name": "my-project",
"version": "1.0.0",
"lockfileVersion": 3,
"dependencies": {
"express": {
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
"integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfzXaUoxih0..."
}
}
}
# 両者の関係
- package.json: 「どのパッケージが必要か」を定義(範囲指定)
- package-lock.json: 「実際にインストールされたバージョン」を記録(固定)
npm installはpackage.jsonの範囲内で最新版を選び、package-lock.jsonを更新する。
npm ciはpackage-lock.jsonに記録された正確なバージョンをインストールする。
# よくあるエラーと対処法
# npm ci でエラーが発生する
エラー: npm ci can only install packages when your package.json and package-lock.json are in sync
原因: package.jsonとpackage-lock.jsonの内容が一致していない
対処:
# 開発環境でpackage-lock.jsonを再生成
rm package-lock.json
npm install
# 変更をコミット
git add package-lock.json
git commit -m "Update package-lock.json"
# package-lock.json が存在しない
エラー: npm ci can only install packages with an existing package-lock.json
原因: package-lock.jsonがGitにコミットされていない、または削除された
対処:
# package-lock.jsonを生成
npm install
# package-lock.jsonをGitに追加
git add package-lock.json
git commit -m "Add package-lock.json"
# 異なる環境で異なるバージョンがインストールされる
原因: package-lock.jsonが更新されていない、またはGitにコミットされていない
対処:
# 開発環境でpackage-lock.jsonを更新
npm install
# 必ずpackage-lock.jsonをGitにコミット
git add package-lock.json
git commit -m "Update package-lock.json"
# npm install が遅い
原因: キャッシュの問題や、不要なパッケージがインストールされている
対処:
# npmキャッシュをクリア
npm cache clean --force
# node_modulesを削除して再インストール
rm -rf node_modules
npm install
# または、npm ciを使用(より高速)
npm ci
# 本番環境で開発依存関係がインストールされる
原因: npm installを使用している
対処:
# 本番環境ではnpm ci --productionを使用
npm ci --production
# これにより、devDependenciesがインストールされない
# 実装時の注意点
# package-lock.json を必ずGitにコミット
package-lock.jsonは必ずバージョン管理に含め、.gitignoreに追加しない。これにより、チーム全体で同じバージョンのパッケージを使用できる。
# チーム開発でのルール
- 開発者:
npm installを使用してパッケージを追加・更新 - CI/CD:
npm ciを使用して依存関係をインストール - 本番環境:
npm ci --productionを使用
# 定期的な依存関係の更新
定期的に依存関係を確認し、セキュリティ脆弱性をチェックして修正する。
# バージョン管理の一貫性
package-lock.jsonを更新したら必ずコミットし、プルリクエスト前にnpm ciで動作確認を行う。