Skip to content

Nxキャッシュのクリア方法

問題

Nxモノレポには、デフォルトで ./node_modules/.cache/nx/ ディレクトリにキャッシュが保存されます。このキャッシュはビルドやテストの結果を保存して再実行を高速化しますが、長期間使用していると数GBものサイズになることがあります。特にディスクスペースが限られている環境では、このキャッシュを効果的に管理する方法が必要です。

解決方法

1. nx reset コマンドの使用 (推奨)

最新のNxバージョンでは、公式の nx reset コマンドを使用するのが最も安全で効果的な方法です。

bash
nx reset

このコマンドはNxキャッシュを完全にクリアし、キャッシュの整合性を保ちながら安全に削除します。

INFO

nx reset はNx v12以降で利用可能です。古いバージョンでは利用できない場合があります。

2. 手動でのキャッシュ削除

シンプルな方法として、キャッシュディレクトリを直接削除することもできます。

bash
rm -rf ./node_modules/.cache/nx

WARNING

この方法は確実にキャッシュを削除しますが、実行中のNxプロセスがある場合は問題が発生する可能性があります。安全のため、すべてのNx関連プロセスを停止してから実行してください。

3. キャッシュをスキップした実行

一時的にキャッシュを使用せずにタスクを実行したい場合、--skip-nx-cache フラグを使用できます。

bash
npx nx run build --skip-nx-cache
npx nx run test --skip-nx-cache

TIP

この方法はキャッシュを使用しないだけで、既存のキャッシュを削除するわけではありません。既存のキャッシュは残ったままになります。

4. キャッシュ場所の変更

キャッシュの場所が問題になる場合は、設定ファイルでキャッシュディレクトリを変更できます。

nx.json:

json
{
  "tasksRunnerOptions": {
    "default": {
      "options": {
        "cacheDirectory": "/tmp/nx-cache"
      }
    }
  }
}

この設定により、キャッシュを node_modules 外の場所に保存できます。

キャッシュ管理の自動化

定期的なキャッシュクリーンアップを自動化するスクリプトの例です。

javascript
// clear-nx-cache.js
const fs = require('fs');
const { execSync } = require('child_process');

const CACHE_PATH = './node_modules/.cache/nx';
const MAX_CACHE_SIZE_MB = 2048;

function getDirectorySize(path) {
  const output = execSync(`du -sb ${path} 2>/dev/null || echo "0"`).toString();
  return parseInt(output.split('\t')[0]) || 0;
}

if (fs.existsSync(CACHE_PATH)) {
  const sizeBytes = getDirectorySize(CACHE_PATH);
  const sizeMB = (sizeBytes / 1024 / 1024).toFixed(2);
  
  console.log(`NXキャッシュサイズ: ${sizeMB} MB`);
  
  if (sizeMB > MAX_CACHE_SIZE_MB) {
    console.log('キャッシュをクリアします...');
    execSync('nx reset');
    console.log('キャッシュのクリアが完了しました');
  }
}

package.jsonにスクリプトを追加:

json
{
  "scripts": {
    "clean:nx-cache": "node clear-nx-cache.js"
  }
}

まとめ

Nxキャッシュの管理方法は以下のように使い分けることができます:

  • 通常のクリーンアップ: nx reset を使用
  • 緊急時の完全削除: 手動でディレクトリを削除
  • 一時的なキャッシュ無効化: --skip-nx-cache フラグを使用
  • 場所の変更: nx.jsonでキャッシュディレクトリを設定

定期的なキャッシュ管理は、ディスクスペースの節約とビルドパフォーマンスの最適化に役立ちます。

参考情報