今のところ npm ci
は、CIを使用するときにノードモジュールをインストールする最も一般的な方法です。しかし、正直言って本当に遅いです。高速化する方法はありますかnpm ci
キャッシュを使用するか、既存のパッケージ(node_modulesフォルダー全体)を完全に削除しませんか?
tl; dr No。
npm ci
はpackage-lock.json
ファイルを尊重するため、CIでは優先する必要があります。 npm install
とは異なり、ファイルを書き換えて常に新しいバージョンをインストールします。
設計による このコマンドは、最初にnode_modules
ディレクトリを削除することにより、常にすべてのローカルパッケージをパージします。これが、長いビルドの主な理由です。そして、この苛立たしい行動を回避するオプションはありません。
ローカルマシンでは、オプションnpm ci
を追加することで--prefer-offline
を高速化できます。これにより、NPMはキャッシュの最小時間を無視し、ローカルでキャッシュされたパッケージをレジストリで検証する代わりにすぐに使用します。
ただし、 NPMキャッシュ は、UNIXでは~/.npm
、Windowsでは%AppData%/npm-cache
にあります。これらのフォルダーは、ほとんどのCIではデフォルトでキャッシュできません。たとえば、GitLab CIキャッシュには 利用可能なワークスペースとしてのリポジトリ のみがあります。ホームディレクトリやシステムディレクトリなどの他のディレクトリ(例:apt
)はキャッシュされません。したがって、この設定はおそらくCIのビルド時間には影響しません。
古いバージョンのNPMでは、オプション--progress=false
は進行状況バーを削除することにより、ビルド時間に大きな影響を与えました。この問題は解消されたようですが、もう注目すべき違いは測定できません。
ベストプラクティスであり、確実に速度が向上するのは、 パッケージを本番と開発に分ける です。オプション--only=production
を渡すことにより、NPMは開発の依存関係を無視します。上記の理由により、これはキャッシングに影響しません。
CIにnpmのキャッシュディレクトリをキャッシュするように指示してから、オプション--prefer-offlineおよび--no-auditを使用できます。例:npm ci --prefer-offline --no-audit
NPMキャッシュは~/.npm
にありますが、ほとんどのCIでは、作業ディレクトリ内にのみキャッシュできます。
これを回避するためにできることは、npm set cache .npm
を使用してキャッシュディレクトリを現在のディレクトリに変更することです。 NPMキャッシュは./.npm
に配置され、CIジョブ間でこのフォルダーをキャッシュできます。
GitLab CIの例:
my-super-job:
image: node:13-Alpine
script:
- npm set cache .npm
- npm ci
cache:
paths:
- .npm
編集:あなたができることを発見した コマンドラインフラグとして設定を設定する したがって、npm ci --cache .npm
も同じようにする必要がある