どのディレクトリがキャッシングに最適かについて、私はかなり混乱しています。私は使用と推奨の両方を確認しましたが、なぜどちらか一方に進む理由についての実際の比較はありません。
たとえば、Travis blogitself は以下を推奨します。
cache:
directories:
- node_modules
ただし、 数千の場所 代わりにこれを使用します。
cache:
directories:
- $HOME/.npm
それでは、なぜ一方を他方で使用し、なぜ両方を含めないのでしょうか。
node_modules
キャッシュをキャッシュすると回避できたのに対し、.npm
フォルダーをキャッシュすると問題(ビルド失敗)が発生することに気付きました。これは、.npm
キャッシュにはコンパイル済みのネイティブモジュールが格納されず、node_modules
フォルダーには格納されるためと考えられます。したがって、Travis-CIで一般的であるように、node
のさまざまなバージョンをテストすると、たとえばnode
4のnode
6およびbarf用にコンパイルされたネイティブモジュールをロードしようとします。
@Johnの回答をフォローアップします。
package-lock.json
のパッケージ依存関係を厳密に守るために、Travis CIのnpmインストールプロセスは、npm ci
ではなく、デフォルトで新しいnpm install
(ci
は、継続的インテグレーションを表します)にデフォルト設定されます。 。これは、適切なセマンティックバージョニングに従っていないパッケージのインストールを防ぐのに役立ちます。
これを行うには、最初にnpm ci
が依存グラフと以前のビルドからnode_modules
にキャッシュされたすべてのコンパイル済みモジュールを削除して、依存グラフを再構築する必要があります。これは、独自のインストールを開始する前にnode_modules
を完全に削除することによって行われます。ただし、これはnode_modules
がTravisのキャッシュの場所として使用できなくなったことも意味します。ここで、"$HOME/.npm"
を使用してキャッシュする必要があります。@ Johnは、「$ HOME/.npm」を使用して理由を説明しています。 "/node_modules/.bin/npm cannot be found"
はnode_modules
の実行時に削除されているため、node_modules
をキャッシュの場所として引き続き使用すると、Travisはnpm ci
に対して不平を言うエラーをスローします。
次に、使用するキャッシュの場所について...
現在のデフォルトのnpm ci
を使用する場合は、これらの変更を.travis.yml
に含めます。
# [optional] `npm ci` is now default on Travis
install:
- npm ci
# Keep the npm cache around to speed up installs
cache:
directories:
- "$HOME/.npm"
古いnpm install
を使い続ける場合
# Specify `npm install`
install:
- npm install
# Continue to use the old cache location
cache:
directories:
- "node_modules"
警告:キャッシュの場所は、インストール方法に従って厳密に使用され、別の場所と絡み合わせることができません。そうしないと、キャッシングの利点が失われるか、さらにはTravisビルドが失敗することになります。これがあなたの質問に答えてくれることを願っています。
npm ci
の詳細については、 公式ドキュメント を参照してください。