package.jsonとpackage-lock.jsonについて

# package.jsonとpackage-lock.json

## はじめに
アプリケーション開発において、依存関係の管理は非常に重要です。特に、JavaScriptやNode.jsを使用するプロジェクトでは、npmを使用してパッケージを管理します。
その際に欠かせないファイルが`package.json`と`package-lock.json`です。これらのファイルはプロジェクトの依存関係を適切に管理し、開発環境を整えるために使用され、本記事では`package.json`と`package-lock.json`についてまとめた内容を発信します。


## package.json
- **概要**: プロジェクトの依存関係やスクリプトを管理するファイル。どのパッケージがプロジェクトに必要かを記載します。
- **役割**: 依存パッケージの名前とバージョンを指定し、プロジェクトの設定やメタデータも含めることができます。
- **具体例**:
  ```json
  {
    "name": "my-project",
    "version": "1.0.0",
    "scripts": {
      "start": "node index.js",
      "test": "jest"
    },
    "dependencies": {
      "express": "^4.17.1",
      "lodash": "^4.17.21"
    },
    "devDependencies": {
      "jest": "^26.6.0"
    }
  }


  ```

## package-lock.json
- **概要**: インストールされたパッケージの正確なバージョンとその依存関係を記録するファイル。プロジェクトの再現性を保つために重要です。
- **役割**: 依存パッケージの詳細なバージョン情報を記録し、異なる環境で同じ依存関係がインストールされることを保証します。
- **具体例**:
```json
{
  "name": "my-project",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "express": {
      "version": "4.17.1",
      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
      "integrity": "sha512...",
      "requires": {
        "accepts": "~1.3.7",
        ...
      }
    },
    "lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512..."
    }
  }
}

  ```


## システム開発における注意点
- **バージョンの整合性**: package-lock.jsonはプロジェクトにインストールされたパッケージの正確なバージョンを記録するため、チーム全体で同じ環境を再現するのに役立ちます。
- **依存関係の管理**: 新しいパッケージの追加や既存パッケージの更新を行う際は、必ずpackage-lock.jsonを確認し、必要な依存関係が正しく反映されているかをチェックします。
- **セキュリティの考慮**: 依存パッケージにセキュリティホールがないか、定期的にnpm auditや他のセキュリティツールを使用してチェックします。

## npmコマンドとの関係性
- **npm install**: package.jsonに記載された依存関係を元にパッケージをインストールします。package-lock.jsonが存在する場合は、その情報を元に正確なバージョンでインストールされます。
- **package.jsonからのインストール**: 新しいパッケージをインストールする際には、package.jsonとpackage-lock.jsonの両方に依存関係が追加されます。
package-lock.jsonが存在しない場合は、package.jsonを元に依存関係をインストールし、同時にpackage-lock.jsonが生成されます。

## 実例
１. **パッケージのインストール**

    ```bash
    npm install express
    ```

- 実行後、package.jsonのdependenciesセクションに"express": "^4.17.1"などが追加され、package-lock.jsonにはインストールされた正確なバージョンとその依存関係が記録されます。

２. **全ての依存関係のインストール:**

    ```bash
    npm install
    ```

- package.jsonとpackage-lock.jsonを元に依存関係がインストールされます。package-lock.jsonが存在する場合は、その内容が優先され、正確なバージョンでパッケージがインストールされます。

３. **パッケージの更新**

    ```bash
    npm update
    ```

- package.jsonのバージョン範囲に従って依存パッケージを最新バージョンに更新し、package-lock.jsonもそれに合わせて更新されます。

４. **依存関係の監査**

    ```bash
    npm audit
    ```

- プロジェクトの依存関係にセキュリティの脆弱性がないかをチェックし、必要に応じて修正します。

## npm install時のパッケージのバージョンについて
npm installを行う際にpackage-lock.jsonが存在する場合と存在しない場合では、インストールされるパッケージのバージョンが異なることがあります。以下に詳しく説明します。

### package-lock.jsonが存在する場合
- **バージョンの固定**: package-lock.jsonは、プロジェクトにインストールされた正確なパッケージバージョンを記録します。そのため、npm installを実行すると、package-lock.jsonに記録されたバージョンのパッケージがインストールされます。これにより、開発環境の再現性が保証されます。
- **一貫性**: チーム全体で同じバージョンのパッケージを使用することができ、異なる環境でも同じ依存関係が確保されます。

### package-lock.jsonが存在しない場合
- **バージョン範囲に基づくインストール**: npm installはpackage.jsonに記載されたバージョン範囲（例えば^1.0.0や~2.0.0）に基づいて、最新の互換バージョンのパッケージをインストールします。
- **不確定要素**: package-lock.jsonがないと、異なる環境や異なるタイミングでインストールするたびに、異なるバージョンのパッケージがインストールされる可能性があります。

### 具体的な例
１. package-lock.jsonが存在する場合:

```json
// package.json
{
  "dependencies": {
    "express": "^4.17.1"
  }
}

// package-lock.json
{
  "dependencies": {
    "express": {
      "version": "4.17.1",
      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
      "integrity": "sha512-..."
    }
  }
}
```
- npm installを実行すると、package-lock.jsonに記録された正確なバージョン（この場合は4.17.1）のexpressがインストールされます。


２. package-lock.jsonが存在しない場合:

```json

// package.json
{
  "dependencies": {
    "express": "^4.17.1"
  }
}
```
- npm installを実行すると、package.jsonに基づき、現在利用可能な4.x.xの最新バージョンのexpressがインストールされます。例えば、4.18.0がリリースされている場合はそれがインストールされます。
この違いにより、package-lock.jsonの有無はインストールされるパッケージのバージョンに大きく影響します。package-lock.jsonがあることで、プロジェクトの再現性と安定性が保たれます。

## まとめ
package.jsonとpackage-lock.jsonがどのように連携し、プロジェクトの依存関係を管理しているかを理解するためにまとめました。
これにより、チーム全体で一貫した開発環境を維持し、再現性のあるプロジェクト構築が可能になります。またチームでバージョンがってないなどの問題が発生した際に、なぜそうなっているのかを把握できるようになるかと思います。