50〜100GBを安全に解放:.NET・ゲーム・デスクトップ開発者のためのディスククリーンアップ完全ガイド
Windows環境で開発を行うすべてのエンジニアにとって、ある日突然訪れる悪夢があります。作業を開始しようとPCを起動すると、1TBのNVMe SSDの空き容量が残り2GB未満になり、警告が表示される現象です。
大容量の動画をダウンロードしたわけでも、新しい大作ゲームをインストールしたわけでもありません。一体どこへ容量が消えたのでしょうか?
.NET 8/9、MonoGame、Android、そしてMicrosoft Store向けパッケージング(MSIX/WAP)を扱うインディーゲーム兼デスクトップ開発者として調査した結果、プロジェクトリポジトリ内に68GB以上もの不要なビルド成果物やパッケージキャッシュが蓄積していることが判明しました。
本記事では、開発環境が肥大化する構造的な理由、これらを削除しても100%安全である根拠、そしてワンクリックで数十GBを取り戻せるPowerShell/Batchスクリプトを共有します。
1. 開発環境のディスク肥大化の構造
クロスプラットフォーム対応のソリューションをコンパイルする際、ビルドツールチェーンは各工程で中間バイナリやアセットを複製します。
flowchart TD
subgraph "プロジェクトワークスペース"
Code["ソースコード (.cs, .xaml, .json)\n(保護対象 - 数MB)"]
Assets["元アセット (PNG, OGG, Shader)\n(保護対象)"]
Git[".git 履歴\n(保護対象)"]
BinObj["bin & obj フォルダ\n(中間DLL、シンボル、複製)\n[30 - 60 GB]"]
AppPackages["WAP / MSIX AppPackages\n(過去の .msixbundle, .msixupload)\n[5 - 20 GB]"]
end
subgraph "システム&グローバルキャッシュ"
NuGet["%USERPROFILE%\\.nuget\\packages\n(グローバルNuGetキャッシュ)\n[10 - 20 GB]"]
Temp["%LOCALAPPDATA%\\Temp\n(コンパイラ一時ファイル)\n[3 - 10 GB]"]
end
style BinObj fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
style AppPackages fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
style NuGet fill:#ff922b,stroke:#d9480f,stroke-width:2px,color:#fff
style Temp fill:#ff922b,stroke:#d9480f,stroke-width:2px,color:#fff
原因1:bin と obj フォルダ(30〜60GB以上)
obj/(中間出力): 差分コンパイル情報やプラットフォーム固有の中間ファイルを保持します。Androidターゲットの場合、1プロジェクトだけで3〜6GBに達することがあります。bin/(バイナリ出力): 実行ファイルおよび<CopyToOutputDirectory>で複製されたアセットを格納します。10個のプロジェクトが500MBの共通ゲームコンテンツを参照していると、合計5GBが重複消費されます。
原因2:Microsoft Store の AppPackages(5〜20GB以上)
ストア配信用にパッケージを作成するたびに、.msixbundle やデバッグシンボル(PDB)を含む .msixupload が生成されます。Visual Studioは過去のバージョンを自動削除しないため、蓄積し続けます。
原因3:NuGet グローバルキャッシュ(10〜20GB以上)
%USERPROFILE%\.nuget\packages には、過去にダウンロードされたすべてのバージョンが保持されます。
原因4:Windows Temp フォルダ(3〜10GB)
コンパイルやパッケージ圧縮時に %LOCALAPPDATA%\Temp に展開された作業ファイル群です。
2. 安全性の保証:なぜ100%リスクがないのか?
| 保護される対象(絶対に削除されません) | 安全に削除できる対象(完全に再生成可能) |
|---|---|
ソースコード: .cs, .xaml, .cpp, .json など |
コンパイラ中間オブジェクト (obj/) |
プロジェクト設定: .sln, .csproj, .wapproj |
コンパイル済みバイナリ (bin/) |
Gitリポジトリ: .git/ フォルダ、履歴、ブランチ |
過去のストア配信用パッケージ (AppPackages/) |
| 元アセット: 画像、音声、シェーダー | キャッシュされたNuGetパッケージ (.nuget\packages) |
証明書: .pfx, StoreAssociation.xml |
Windows一時ファイル (%LOCALAPPDATA%\Temp) |
Visual Studioを再起動したらどうなる?
ソリューションを開いて ビルド (Build) または リビルド (Rebuild) を実行するだけで、ソースコードから最新のbinとobjが自動生成されます。Gitのコミット履歴やソースコードは一切影響を受けません。
3. 自動化スクリプト:ワンクリックで安全に削除
PowerShell スクリプト本体 (_tools/Clean-DevDiskSpace.ps1)
<#
.SYNOPSIS
開発者向けディスク容量クリーンアップツール
#>
[CmdletBinding()]
param (
[switch]$Force,
[switch]$ScanOnly,
[switch]$SkipNuget,
[switch]$SkipTemp,
[string]$RootPath = ""
)
if ([string]::IsNullOrWhiteSpace($RootPath)) {
if ($PSScriptRoot) { $RootPath = (Join-Path $PSScriptRoot "..") } else { $RootPath = Get-Location }
}
$resolvedRoot = (Resolve-Path $RootPath -ErrorAction SilentlyContinue).Path
if ([string]::IsNullOrWhiteSpace($resolvedRoot) -or $resolvedRoot -in @("C:\", "C:", "\", "/")) {
Write-Host "安全保護エラー:ルートドライブが指定されたため処理を中断しました。" -ForegroundColor Red
exit 1
}
$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "現在のCドライブ空き容量: $freeGBBefore GB" -ForegroundColor Yellow
$binObjDirs = Get-ChildItem -Path $resolvedRoot -Recurse -Directory -Force -ErrorAction SilentlyContinue |
Where-Object { $_.Name -in @('bin', 'obj') }
$appPackageDirs = Get-ChildItem -Path $resolvedRoot -Recurse -Directory -Filter "AppPackages" -Force -ErrorAction SilentlyContinue
if ($ScanOnly) { Write-Host "スキャン完了。" -ForegroundColor Yellow; return }
if (-not $Force) {
$prompt = Read-Host "削除を実行しますか? (Y/N)"
if ($prompt -notin @('Y', 'y')) { return }
}
$binObjDirs | ForEach-Object { try { Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue } catch {} }
$appPackageDirs | ForEach-Object { try { Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue } catch {} }
if (-not $SkipTemp) { Get-ChildItem -Path [System.IO.Path]::GetTempPath() -Force -ErrorAction SilentlyContinue | ForEach-Object { try { Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue } catch {} } }
if (-not $SkipNuget) { try { $null = dotnet nuget locals all --clear 2>&1 } catch {} }
$freeGBAfter = [math]::Round((Get-PSDrive -Name C).Free / 1GB, 2)
$freedTotal = [math]::Round($freeGBAfter - $freeGBBefore, 2)
Write-Host "`nクリーンアップ完了! 解放容量: +$freedTotal GB" -ForegroundColor Green
バッチファイル起動ランチャー (clean-disk-space.bat)
@echo off
setlocal
title Workspace Disk Cleanup
cd /d "%~dp0"
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0_tools\Clean-DevDiskSpace.ps1" %*
pause
4. 実際の検証結果:1.35GBから53.80GBへ
- 実行前空き容量: 1.35 GB(警告状態)
- 実行後空き容量: 53.80 GB
- 回復した容量: +52.45 GB(所要時間:約3分)
開発効率を維持するためにも、定期的なクリーンアップをおすすめします。
Arar Games と作品のご紹介
インディーゲーム作品とスタジオ公式リンク:
- 🌐 公式サイト: https://www.mayhemcorporation.com
🎮 ゲーム作品
- Blocked: Pixel Panzer: ダイナミックな天候と巨大ボス戦が楽しめるレトロ戦車アーケードバトル。
Google Play (Android & PC) - PaintTrek: 鮮やかな色彩のパズルとピクセルペイントアクション。
Google Play | Microsoft Store (PC & Xbox) - Space Dodger: 反射神経が試される超高速レトロ宇宙障害物回避ゲーム。
Google Play
📱 公式SNSアカウント
- 🎵 TikTok: https://www.tiktok.com/@arargamesstudio
- 📸 Instagram: https://www.instagram.com/arargamesstudio
- 🐦 X (Twitter): https://x.com/arargamesstudio
- 📺 YouTube: https://www.youtube.com/@koreaaria
- 🧵 Threads: https://www.threads.net/@arargamesstudio
- 📘 Facebook: https://www.facebook.com/arargamesstudio
Hiç yorum yok:
Yorum Gönder