Nxキャッシュのクリア方法
問題
Nxモノレポには、デフォルトで ./node_modules/.cache/nx/
ディレクトリにキャッシュが保存されます。このキャッシュはビルドやテストの結果を保存して再実行を高速化しますが、長期間使用していると数GBものサイズになることがあります。特にディスクスペースが限られている環境では、このキャッシュを効果的に管理する方法が必要です。
解決方法
1. nx reset
コマンドの使用 (推奨)
最新のNxバージョンでは、公式の nx reset
コマンドを使用するのが最も安全で効果的な方法です。
nx reset
このコマンドはNxキャッシュを完全にクリアし、キャッシュの整合性を保ちながら安全に削除します。
INFO
nx reset
はNx v12以降で利用可能です。古いバージョンでは利用できない場合があります。
2. 手動でのキャッシュ削除
シンプルな方法として、キャッシュディレクトリを直接削除することもできます。
rm -rf ./node_modules/.cache/nx
WARNING
この方法は確実にキャッシュを削除しますが、実行中のNxプロセスがある場合は問題が発生する可能性があります。安全のため、すべてのNx関連プロセスを停止してから実行してください。
3. キャッシュをスキップした実行
一時的にキャッシュを使用せずにタスクを実行したい場合、--skip-nx-cache
フラグを使用できます。
npx nx run build --skip-nx-cache
npx nx run test --skip-nx-cache
TIP
この方法はキャッシュを使用しないだけで、既存のキャッシュを削除するわけではありません。既存のキャッシュは残ったままになります。
4. キャッシュ場所の変更
キャッシュの場所が問題になる場合は、設定ファイルでキャッシュディレクトリを変更できます。
nx.json:
{
"tasksRunnerOptions": {
"default": {
"options": {
"cacheDirectory": "/tmp/nx-cache"
}
}
}
}
この設定により、キャッシュを node_modules
外の場所に保存できます。
キャッシュ管理の自動化
定期的なキャッシュクリーンアップを自動化するスクリプトの例です。
// 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にスクリプトを追加:
{
"scripts": {
"clean:nx-cache": "node clear-nx-cache.js"
}
}
まとめ
Nxキャッシュの管理方法は以下のように使い分けることができます:
- 通常のクリーンアップ:
nx reset
を使用 - 緊急時の完全削除: 手動でディレクトリを削除
- 一時的なキャッシュ無効化:
--skip-nx-cache
フラグを使用 - 場所の変更: nx.jsonでキャッシュディレクトリを設定
定期的なキャッシュ管理は、ディスクスペースの節約とビルドパフォーマンスの最適化に役立ちます。