3.0 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	NuGet Preview Bootstrap (Offline-Friendly)
The StellaOps build relies on .NET 10 RC2 packages (Microsoft.Extensions.*, JwtBearer 10.0 RC).
NuGet.config now wires three sources:
- local→- ./local-nuget(preferred, air-gapped mirror)
- dotnet-public→- https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json
- nuget.org→ fallback for everything else
Follow the steps below whenever you refresh the repo or roll a new Offline Kit drop.
1. Mirror the preview packages
./ops/devops/sync-preview-nuget.sh
- Reads ops/devops/nuget-preview-packages.csv. Each line specifies the package, version, expected SHA-256 hash, and (optionally) the flat-container base URL (we pin todotnet-public).
- Downloads the .nupkgstraight into./local-nuget/and re-verifies the checksum. Existing files are skipped when hashes already match.
- Use NUGET_V2_BASEif you need to temporarily point at a different mirror.
💡 The script never mutates packages in place—if a checksum changes you will see a “SHA mismatch … refreshing” message.
2. Restore using the shared NuGet.config
From the repo root:
DOTNET_NOLOGO=1 dotnet restore src/Excititor/__Libraries/StellaOps.Excititor.Connectors.Abstractions/StellaOps.Excititor.Connectors.Abstractions.csproj \
  --configfile NuGet.config
The packageSourceMapping section keeps Microsoft.Extensions.*, Microsoft.AspNetCore.*, and Microsoft.Data.Sqlite bound to local/dotnet-public, so dotnet restore never has to reach out to nuget.org when mirrors are populated.
Before committing changes (or when wiring up a new environment) run:
python3 ops/devops/validate_restore_sources.py
The validator asserts:
- NuGet.configlists- local→- dotnet-public→- nuget.orgin that order.
- Directory.Build.propspins- RestoreSourcesso every project prioritises the local mirror.
- No stray NuGet.configfiles shadow the repo root configuration.
CI executes the validator in both the build-test-deploy and release workflows,
so regressions trip before any restore/build begins.
If you run fully air-gapped, remember to clear the cache between SDK upgrades:
dotnet nuget locals all --clear
3. Troubleshooting
| Symptom | Fix | 
|---|---|
| dotnet restorestill hits nuget.org for preview packages | Re-run sync-preview-nuget.shto ensure the.nupkgexists locally, then delete~/.nuget/packages/microsoft.extensions.*so the resolver picks up the mirrored copy. | 
| SHA mismatch in the manifest | Update ops/devops/nuget-preview-packages.csvwith the new version + checksum (from the feed) and re-run the sync script. | 
| Azure DevOps feed throttling | Set DOTNET_PUBLIC_FLAT_BASEenv var and point it at your own mirrored flat-container, then add the URL to the 4th column of the manifest. | 
Keep this doc alongside Offline Kit instructions so air-gapped operators know exactly how to refresh the mirror and verify packages before restore.