Caching Mechanism
msvc-kit uses multiple caching strategies to minimize downloads and speed up operations.
Cache Types
| Cache | Location | Purpose |
|---|---|---|
| Download Index | downloads/{msvc|sdk}/.../index.db | Track downloaded files |
| Manifest Cache | cache/manifests/ | VS manifest with ETag |
| Extraction Markers | .msvc-kit-extracted/ | Skip re-extraction |
Download Index
The download index is a redb database that tracks:
- Downloaded file paths
- File hashes (SHA256)
- Download timestamps
Skip Logic
When downloading, files are skipped based on:
cached- File exists in index with matching hash304- Server returns Not Modified (ETag/Last-Modified match)size match- File size matches expected (best-effort fallback)
TIP
Size match is a best-effort optimization. Same size doesn't guarantee same content, but it's a reasonable heuristic for large binary packages.
Manifest Cache
VS manifests are cached with HTTP conditional requests:
GET /manifest.json
If-None-Match: "abc123"
If-Modified-Since: Mon, 01 Jan 2024 00:00:00 GMTIf the manifest hasn't changed, the server returns 304 Not Modified and the cached version is used.
Extraction Markers
After extracting a package, a marker file is created:
.msvc-kit-extracted/
├── package1.vsix.done
├── package2.msi.done
└── package3.cab.doneRe-running extraction skips packages with existing markers.
Cache Management
View Cache Size
powershell
# Download cache
Get-ChildItem "$env:LOCALAPPDATA\loonghao\msvc-kit\downloads" -Recurse |
Measure-Object Length -Sum |
Select-Object @{N='Size (MB)';E={[math]::Round($_.Sum/1MB, 2)}}Clear Cache
bash
# Clear download cache only
msvc-kit clean --cache
# Clear everything including cache
msvc-kit clean --all --cacheForce Re-download
bash
# Clear cache first
msvc-kit clean --cache
# Then download
msvc-kit downloadEnvironment Variables
| Variable | Effect |
|---|---|
MSVC_KIT_INNER_PROGRESS | Set to 1 to show detailed extraction progress |
Debugging Cache Issues
Enable tracing to see cache decisions:
bash
$env:RUST_LOG = "msvc_kit=debug"
msvc-kit downloadOutput shows:
DEBUG msvc_kit::downloader: Checking cache for package1.vsix
DEBUG msvc_kit::downloader: Cache hit: package1.vsix (hash match)
DEBUG msvc_kit::downloader: Downloading package2.vsix (not in cache)