[GitHub Actions] package.jsonの中のdevDependenciesから特定のパッケージだけインストールする方法

2 min read

背景

大量の依存パッケージを持つアプリケーションにおいてCI/CD環境での実行時間を短縮するために、特定の依存パッケージのみをインストールしたい場合がある。

今回はDependency cruiserを利用しているケースを元にpackage.jsonの中のdevDependenciesから特定のものだけをインストールする。

Dependency cruiser

Dependency cruiserとは、JavaScriptやTypeScriptのプロジェクトにおいて、依存関係の可視化を行うためのツール。依存関係のグラフを生成や特定ルールの検知ができる。

今回は、ローカル環境ではnpm scriptsを利用してDependency cruiserをLintとして実行している。さらにPull RequestにDependency cruiserの結果をGitHub Actionsを利用してコメントを残すためにCI/CD環境でも実行するといった複数な環境で実行している場合とする。

方法

bashを利用して、package.jsonの中のdevDependenciesから特定のものだけをインストールする(CIあまり関係ない)。

コード

ワークフローファイル(yaml)で以下のように記述する。

- name: Install dependencies
  run: |
    # 1. package.jsonから devDependencies に存在している dependency-cruiser のバージョンを取得
    DEPENDENCY_CRUISER_VERSION=$(cat package.json | jq -r '.devDependencies["dependency-cruiser"]')

    # 2. package.json および package-lock.json を削除
    rm package*.json

    # 3. dependency-cruiser のみをインストール
    npm install --save-dev dependency-cruiser@${DEPENDENCY_CRUISER_VERSION}

package.jsonから対象のパッケージのバージョンを取得し、package.jsonおよびpackage-lock.jsonを削除した後、npm installで特定のパッケージのみをインストールしている。

これによって不必要なほかのパッケージをインストールしないため、npm installの実行時間を短縮できる。また、通常の環境ではnpmを利用しているが、ほかのパッケージマネージャーをCI/CD環境上で利用したい場合も有用である。