dver is a .NET SDK version manager inspired by nvm.
Instead of installing SDKs into the shared system dotnet location, dver keeps each SDK isolated under its own managed directory and exposes a stable dotnet shim. That makes version switching predictable on Windows, Linux, and macOS.
- Managed SDKs now live in a dedicated
dverroot:- Windows:
%LOCALAPPDATA%\dver - Linux and macOS:
~/.dver
- Windows:
- Each SDK is installed into its own isolated directory under
versions/<sdk-version>. dver setupcreates adotnetshim and adds only the shim directory toPATH.dver use --globalnow works likenvm alias default: it sets the default managed SDK instead of writing~/global.json.- Local
dver use <version>still writes a projectglobal.json. dver installresolves versions from Microsoft release metadata, downloads the SDK archive, verifies the SHA-512 checksum, and extracts it into an isolated managed directory (SDKMAN-style).
The previous implementation mixed managed SDKs with the shared user/system dotnet directories, depended on archive URLs that are easy to break, and treated ~/global.json as a global switch even though that is not how .NET version resolution works.
The new flow is closer to nvm:
dver install 8.0.406dver setupdver use 8.0.406 --globaldotnet --version
Or for a project:
dver install 8.0.406dver use 8.0.406dotnet --version
Install a specific SDK version:
dver install 8.0.406Install the latest SDK from a channel:
dver install 8.0Install the latest LTS SDK:
dver install --ltsCreate the dotnet shim and add it to your PATH:
dver setupRun this once after installing dver, then restart your shell.
Set the default managed SDK:
dver use 8.0.406 --globalCreate a local global.json in the current project:
dver use 8.0.406Clear the default managed SDK:
dver use --global --clearRemove the local global.json:
dver use --cleardver listdver currentdver doctorRemove a managed SDK:
dver uninstall 8.0.406Remove every managed SDK and the dver PATH configuration:
dver uninstall --allSystem-installed .NET SDKs are not removed.
The repository now includes:
CIon Windows, Linux, and macOS- automatic
crates.iopublishing when a newCargo.tomlversion is pushed tomainormaster - automatic GitHub Release creation using the same crate version
- automatic binary packaging for Windows, Linux, and macOS
- automatic Snap package builds, with Snap Store publication when
SNAPCRAFT_STORE_CREDENTIALSis configured - automatic Scoop manifest publication to the
scoop-bucketbranch
Cargo.toml is the single source of truth for versioning:
- bump the crate version in
Cargo.toml - push to
mainormaster - the workflow creates tag
v<version>automatically - the workflow publishes to
crates.io - the workflow creates the GitHub Release with the packaged binaries
The release workflow skips itself when tag v<crate-version> already exists.
The repository now contains snap/snapcraft.yaml and the release workflow builds a snap automatically.
To publish that snap to the Snap Store, configure the repository secret:
SNAPCRAFT_STORE_CREDENTIALS
Generate it with snapcraft export-login for the registered snap name, then store the exported login file content as the secret.
This snap uses classic confinement because dver is a host-facing version manager and needs access to shell profiles and managed SDK directories.
The release workflow automatically updates a Scoop manifest on the scoop-bucket branch.
Users can install from that bucket with:
scoop bucket add dver https://github.com/stescobedo92/dotnet-version-manager --branch scoop-bucket
scoop install dverFlatpak is intentionally not enabled for automatic distribution.
dver is designed to manage host SDKs, PATH shims, and shell startup files. That behavior conflicts with Flatpak sandboxing, so shipping a Flatpak package would be misleading unless the tool is redesigned around host-bridging behavior.
Store-backed publishing still requires these repository secrets:
CARGO_REGISTRY_TOKENSNAPCRAFT_STORE_CREDENTIALS