web-dev-qa-db-ja.com

キャッシュを使用してnpm ciを高速化する方法はありますか?

今のところ npm ciは、CIを使用するときにノードモジュールをインストールする最も一般的な方法です。しかし、正直言って本当に遅いです。高速化する方法はありますかnpm ciキャッシュを使用するか、既存のパッケージ(node_modulesフォルダー全体)を完全に削除しませんか?

19
Nedudi

tl; dr No。

npm cipackage-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は開発の依存関係を無視します。上記の理由により、これはキャッシングに影響しません。

3
pixelbrackets

CIにnpmのキャッシュディレクトリをキャッシュするように指示してから、オプション--prefer-offlineおよび--no-auditを使用できます。例:npm ci --prefer-offline --no-audit

1
Philippe GRANET

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も同じようにする必要がある

1
Kiliandeca