{"id":51025407,"url":"https://github.com/jhonsferg/gvm-rs","last_synced_at":"2026-06-21T19:02:00.395Z","repository":{"id":364190103,"uuid":"1266648322","full_name":"jhonsferg/gvm-rs","owner":"jhonsferg","description":"gvm-rs - A fast, cross-platform Go version manager written in Rust - no sudo, no system deps, one binary","archived":false,"fork":false,"pushed_at":"2026-06-13T20:56:16.000Z","size":1656,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-13T21:26:50.351Z","etag":null,"topics":["cli","cross-platform","devtools","go","go-version-manager","golang","golang-tool","gvm-rs","linux","macos","rust","toolchain","version-manager","windows"],"latest_commit_sha":null,"homepage":"https://github.com/jhonsferg/gvm-rs","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jhonsferg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-11T20:28:02.000Z","updated_at":"2026-06-13T20:52:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jhonsferg/gvm-rs","commit_stats":null,"previous_names":["jhonsferg/gvm","jhonsferg/gvm-rs"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/jhonsferg/gvm-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhonsferg%2Fgvm-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhonsferg%2Fgvm-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhonsferg%2Fgvm-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhonsferg%2Fgvm-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jhonsferg","download_url":"https://codeload.github.com/jhonsferg/gvm-rs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jhonsferg%2Fgvm-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34622271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cross-platform","devtools","go","go-version-manager","golang","golang-tool","gvm-rs","linux","macos","rust","toolchain","version-manager","windows"],"created_at":"2026-06-21T19:01:55.932Z","updated_at":"2026-06-21T19:02:00.383Z","avatar_url":"https://github.com/jhonsferg.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/images/ferris-and-gopher.png\" alt=\"Ferris and Gopher\" width=\"180\" /\u003e\n\n# gvm-rs - Go Version Manager\n\n**A fast, cross-platform Go version manager written in Rust.**\nInstall, switch, and pin any Go release - no `sudo`, no system dependencies, no fuss.\n\n[![Release](https://img.shields.io/github/v/release/jhonsferg/gvm-rs?style=for-the-badge\u0026logo=github\u0026label=Release\u0026color=blueviolet)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![CI](https://img.shields.io/github/actions/workflow/status/jhonsferg/gvm-rs/ci.yml?branch=main\u0026style=for-the-badge\u0026logo=githubactions\u0026logoColor=white\u0026label=CI)](https://github.com/jhonsferg/gvm-rs/actions/workflows/ci.yml)\n[![License](https://img.shields.io/badge/License-MIT-blue?style=for-the-badge\u0026logo=opensourceinitiative\u0026logoColor=white)](LICENSE)\n\n[![Rust](https://img.shields.io/badge/Built_with-Rust-orange?style=for-the-badge\u0026logo=rust\u0026logoColor=white)](https://www.rust-lang.org/)\n[![TLS](https://img.shields.io/badge/TLS-rustls_%28no_OpenSSL%29-lightgrey?style=for-the-badge\u0026logo=letsencrypt\u0026logoColor=white)](https://github.com/rustls/rustls)\n\n[![Windows](https://img.shields.io/badge/Windows-0078D4?style=for-the-badge\u0026logo=windows11\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge\u0026logo=linux\u0026logoColor=black)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![macOS](https://img.shields.io/badge/macOS-000000?style=for-the-badge\u0026logo=apple\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![Android](https://img.shields.io/badge/Android_%28Termux%29-3DDC84?style=for-the-badge\u0026logo=android\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n\n[![x86_64](https://img.shields.io/badge/x86__64-555555?style=for-the-badge\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![ARM64](https://img.shields.io/badge/ARM64-0091BD?style=for-the-badge\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![ARMv7](https://img.shields.io/badge/ARMv7-0091BD?style=for-the-badge\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![386](https://img.shields.io/badge/386-555555?style=for-the-badge\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![riscv64](https://img.shields.io/badge/RISC--V_64-2C3E50?style=for-the-badge\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![s390x](https://img.shields.io/badge/s390x-1F3A8A?style=for-the-badge\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n[![ppc64le](https://img.shields.io/badge/ppc64le-1F3A8A?style=for-the-badge\u0026logoColor=white)](https://github.com/jhonsferg/gvm-rs/releases/latest)\n\n\u003c/div\u003e\n\n---\n\n## ✨ What makes gvm different?\n\ngvm is a Go version manager built from scratch in Rust. It was designed with a single goal: work everywhere, require nothing.\n\n- **No Go required** - you don't need Go installed to install Go. gvm downloads the official toolchain directly from go.dev.\n- **No `sudo`, no root** - everything lives under `~/.gvm` in your home directory.\n- **Zero system dependencies** - a single static binary is all you need.\n- **Truly cross-platform** - one codebase, one behavior across Windows, Linux, and macOS on both x86_64 and ARM64.\n- **SHA-256 verified downloads** - every archive is checked against go.dev's official checksum before extraction.\n- **Fast, resumable downloads** - a single stream with a large read buffer to use as much of the link's throughput as possible. Interrupted downloads resume automatically from the last byte.\n- **Transparent build output** - `gvm build -v` streams every compiler line in real time so you always know what is happening.\n- **Session-scoped activation** - `gvm shell \u003cversion\u003e` activates a version for the current terminal only, without touching any files.\n- **Full environment setup** - `gvm setup` configures everything: shell hook, login profile PATH (so GUI apps like VSCode find Go), and Windows registry. Works correctly after a fresh install or a shell change.\n- **Self-updating** - `gvm upgrade` downloads and replaces the binary in-place.\n- **Clean uninstall** - `gvm implode` removes everything gvm ever touched.\n\n---\n\n## 🚀 Features\n\n- 📥 **Install any Go version** - by exact version, minor range, or `latest`\n- ⚡ **Fast, resumable downloads** - single-stream with automatic resume on interruption (`--retries`)\n- 🔨 **Build from source** - compile any Go version from the official source tarball with automatic bootstrap detection and real-time streaming output\n- 🌍 **Global default** - set a system-wide version with `gvm use`\n- 📌 **Per-project pinning** - drop a `.go-version` file; gvm activates it automatically\n- 🔐 **SHA-256 verification** - every download is checked against go.dev's official checksum\n- 🐚 **Shell integration** - automatic `PATH` and `GOROOT` injection for PowerShell, Bash, Zsh, and Fish\n- ⚡ **`gvm exec`** - run a command with any Go version without changing the global default\n- 🩺 **`gvm doctor`** - diagnose your setup with actionable hints\n- 🔄 **`gvm upgrade`** - self-update to the latest release from GitHub\n- 💣 **`gvm implode`** - completely remove gvm and all installed versions cleanly\n- 🏁 **Shell completions** - Bash, Zsh, Fish, and PowerShell\n- 🖥️ **Cross-platform** - Windows, Linux, macOS × x86_64 and ARM64\n\n---\n\n## 📦 Installation\n\n### 🪟 Windows (PowerShell)\n\n```powershell\nirm https://raw.githubusercontent.com/jhonsferg/gvm-rs/main/install/install.ps1 | iex\n```\n\n\u003e Installs `gvm.exe` to `~\\.local\\bin`, then automatically runs `gvm setup` which adds the binary directory and `~\\.gvm\\current\\bin` to your user `PATH` via the Windows registry, and injects the shell hook into your PowerShell profile.\n\n### 🐧 Linux and 🍎 macOS\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/jhonsferg/gvm-rs/main/install/install.sh | sh\n```\n\n\u003e Installs `gvm` to `~/.local/bin`, then automatically runs `gvm setup` which injects the `gvm env` hook into your shell profile (`~/.bashrc`, `~/.zshrc`, etc.) and adds a static `~/.gvm/current/bin` PATH entry to your login profile (`~/.profile` or `~/.zprofile`) so that GUI applications like VSCode and GoLand can find Go without needing an interactive shell.\n\n### 📂 Custom install directory\n\n```powershell\n# 🪟 Windows\n$env:GVM_INSTALL_DIR = \"C:\\tools\\gvm\"; irm .../install.ps1 | iex\n```\n\n```sh\n# 🐧 Linux / 🍎 macOS\nGVM_INSTALL_DIR=~/.bin curl -fsSL .../install.sh | sh\n```\n\n### ✅ Verify the installation\n\n```sh\ngvm doctor\n```\n\n---\n\n## ⚡ Quick Start\n\n```sh\n# 📥 Install the latest stable Go release\ngvm install latest\n\n# 🌍 Activate it globally\ngvm use latest\n\n# 🔍 Check the active version\ngvm current\n\n# 📌 Pin a version for the current project\ngvm local 1.22\n\n# ⚡ Run tests with a different version, without changing the global default\ngvm exec 1.21 go test ./...\n```\n\n---\n\n## 📖 Commands\n\n### 📥 `gvm install \u003cversion\u003e`\n\nDownloads and installs a Go release from go.dev. The archive is verified against the official SHA-256 checksum before extraction.\n\n```sh\ngvm install latest          # 🆕 latest stable release\ngvm install 1.22            # 🔢 latest patch of Go 1.22\ngvm install 1.22.4          # 🎯 exact version\ngvm install 1.22.4 --force  # 🔄 reinstall even if already present\n```\n\n**Download tuning:**\n\n```sh\ngvm install latest --retries 5     # retry up to 5 times on error\ngvm install latest --retries 0     # fail immediately on first error\n```\n\n| Flag | Default | Description |\n| ---- | ------- | ----------- |\n| `--retries \u003cN\u003e` | `3` | Max retry attempts on network failure. Uses exponential back-off (1 s, 2 s, 4 s, …). |\n\n\u003e 💡 If a download is interrupted (network drop, Ctrl-C), re-running the same `gvm install` command resumes from the last byte written - no data is re-downloaded.\n\n---\n\n### 🔨 `gvm build \u003cversion\u003e`\n\nCompiles a Go release directly from the official source tarball (`go\u003cX\u003e.\u003cY\u003e.\u003cZ\u003e.src.tar.gz`). The resulting toolchain is installed into `~/.gvm/versions/` alongside any binaries installed with `gvm install`. Uses `src/make.bash` on Linux/macOS and `src/make.bat` on Windows.\n\n```sh\ngvm build 1.24.0               # build an exact release\ngvm build 1.24                 # build the latest patch of Go 1.24\ngvm build latest               # build the latest stable release\ngvm build 1.24.0 --force       # rebuild even if already installed\n```\n\n**Stream every compiler line in real time** (recommended for long builds):\n\n```sh\ngvm build 1.24.0 -v\n```\n\nWithout `-v`, gvm shows a spinner with the current build phase and prints the last 100 lines automatically if the build fails.\nWith `-v`, every line from `make.bash`/`make.bat` is printed as it is produced:\n\n```\n  ⠸  Building packages and commands...  0:02:34\n  │  go tool compile -std -trimpath ...\n  │  go tool compile -std -trimpath ...\n```\n\n**Disable CGO** (faster build, no C toolchain needed):\n\n```sh\ngvm build 1.24.0 --no-cgo\n```\n\n**Set a custom bootstrap compiler** (must be already installed via gvm):\n\n```sh\ngvm build 1.24.0 --bootstrap 1.22.6\n```\n\n**Pass extra environment variables** to `make.bash`:\n\n```sh\ngvm build 1.24.0 --env GOAMD64=v3\ngvm build 1.24.0 --env GOAMD64=v3 --env CC=clang\n```\n\n**Download tuning** (source tarball and bootstrap download):\n\n```sh\ngvm build 1.24.0 --retries 5    # retry up to 5 times on error\n```\n\n#### Bootstrap compiler\n\nGo has been self-hosted since version 1.5 - compiling it from source requires a working Go installation as a bootstrap compiler. `gvm build` resolves one automatically:\n\n1. **`--bootstrap \u003cversion\u003e`** - use a specific installed version (must be present via `gvm install`)\n2. **Highest installed gvm version** - reused with no extra download\n3. **Auto-download** - if no Go version is installed at all, gvm downloads the latest patch of the previous minor as a temporary bootstrap and removes it after the build\n\n#### Time and disk requirements\n\nBuilding Go from source takes **5-15 minutes** and requires approximately **3 GB** of free disk space for the source tree, build artifacts, and final installation.\n\n---\n\n### 🌍 `gvm use \u003cversion\u003e` · `gvm default \u003cversion\u003e`\n\nSets the global default Go version. The version must already be installed.\n\n```sh\ngvm use latest\ngvm use 1.22\ngvm use 1.22.4\n```\n\n\u003e 💡 The change takes effect in any new terminal session, or immediately after reloading your profile.\n\n---\n\n### 📌 `gvm local \u003cversion\u003e`\n\nWrites a `.go-version` file in the current directory. gvm reads this file on every shell startup and activates the pinned version automatically.\n\n```sh\n# In your project root:\ngvm local 1.21.9\n```\n\n\u003e The file contains a plain version string (`go1.21.9`) and can be committed to version control so every contributor uses the same toolchain.\n\n\u003e ⚠️ If the pinned version is not installed, gvm prints a warning and falls back to the global default.\n\n---\n\n### 🗑️ `gvm uninstall \u003cversion\u003e`\n\nRemoves an installed Go version from disk.\n\n```sh\ngvm uninstall 1.21.9\n```\n\n---\n\n### 📋 `gvm list`\n\nLists all locally installed Go versions. The active version is highlighted.\n\n```\n  go1.23.0  (active)\n  go1.22.4\n  go1.21.9\n```\n\n---\n\n### 🌐 `gvm list-remote`\n\nLists stable Go versions available for download from go.dev.\n\n```sh\ngvm list-remote          # 📄 latest patch per minor (compact view)\ngvm list-remote --all    # 📜 every patch release\n```\n\nAlready-installed versions are marked with `✓`.\n\n---\n\n### 🔍 `gvm current`\n\nPrints the active Go version and where it came from.\n\n```\ngo1.22.4  (local .go-version)\n```\n\nor\n\n```\ngo1.23.0  (global)\n```\n\n---\n\n### 📂 `gvm path [version]`\n\nPrints the `bin/` directory of the active (or specified) version. Useful for scripting.\n\n```sh\ngvm path              # active version\ngvm path 1.21         # specific version\nexport GOROOT=$(dirname $(gvm path))\n```\n\n---\n\n### 🐚 `gvm env [--shell \u003cname\u003e]`\n\nEmits shell commands that set `PATH` and `GOROOT` for the active version. This is what the shell hook calls on every prompt.\n\n```sh\neval \"$(gvm env)\"               # 🔍 auto-detect shell\ngvm env --shell bash\ngvm env --shell zsh\ngvm env --shell fish\n```\n\n```powershell\n# 🪟 PowerShell\ngvm env --shell powershell | Out-String | Invoke-Expression\n```\n\n---\n\n### 🔧 `gvm setup [--shell \u003cname\u003e] [--reset]`\n\nPerforms **all environment configuration** for gvm. The install scripts run this automatically; you only need it manually after moving the binary, changing your shell, or troubleshooting.\n\n```sh\ngvm setup                    # auto-detect shell\ngvm setup --shell zsh        # configure a specific shell explicitly\ngvm setup --reset            # strip all previous gvm config and re-apply cleanly\ngvm setup --shell bash --reset\n```\n\nWhat `gvm setup` configures:\n\n| Platform | What it does |\n| -------- | ------------ |\n| **Linux / macOS** | Injects `# gvm init` + `# gvm wrapper` into the interactive profile (`~/.bashrc`, `~/.zshrc`, etc.). Also injects a static `export PATH` line into the login profile (`~/.profile` for bash, `~/.zprofile` for zsh) so `~/.gvm/current/bin` is visible to GUI apps (VSCode, GoLand, display managers) that don't source the interactive profile. |\n| **Windows** | Injects `# gvm init` + `# gvm wrapper` into the PowerShell profile. Adds the gvm binary directory and `~\\.gvm\\current\\bin` to the user `PATH` in the Windows registry (`HKCU\\Environment`) so all apps - including GUI editors - see Go without requiring a shell session. |\n\n**Shell validation:** if `--shell \u003cname\u003e` is passed, gvm checks that the shell is actually installed before writing anything. If not found, it exits with an error listing which shells are available on the system.\n\n**`--reset` flag:** strips every `# gvm ...` block from all managed profiles (and the Windows registry) and re-applies configuration from scratch. Only gvm-managed content is touched - all other profile content is preserved.\n\n\u003e Re-running `gvm setup` without `--reset` is always safe - existing up-to-date blocks are left unchanged and stale ones are updated automatically.\n\n---\n\n### ⚡ `gvm exec \u003cversion\u003e \u003ccommand\u003e [args…]`\n\nRuns any command with a specific Go version injected into `PATH` and `GOROOT`, **without changing the global default**.\n\n```sh\n# 🏗️ Build with Go 1.21 while Go 1.22 is the global default\ngvm exec 1.21 go build ./...\n\n# 🧪 Run tests on multiple versions in CI\ngvm exec 1.20 go test ./...\ngvm exec 1.21 go test ./...\ngvm exec 1.22 go test ./...\n\n# 🔍 Check the exact Go binary\ngvm exec 1.22.4 go version\n```\n\n\u003e The exit code of the subprocess is forwarded to the calling process.\n\n---\n\n### 🩺 `gvm doctor [--shell \u003cname\u003e]`\n\nChecks your gvm installation and reports issues with actionable hints:\n\n- 🔍 `gvm` binary is in `PATH`\n- 🌍 A global Go version is set\n- 💾 The global version is installed on disk\n- 📂 `GOROOT` resolves to a valid directory\n- 🐚 The `gvm env` hook is present in the shell profile\n- 📌 The local `.go-version` (if any) is installed\n\n```sh\ngvm doctor\ngvm doctor --shell zsh\n```\n\n\u003e Exits with code `1` if any issue is found - perfect for CI health checks.\n\n---\n\n### 🔄 `gvm upgrade [--force]`\n\nSelf-updates gvm to the latest release published on GitHub.\n\n```sh\ngvm upgrade              # 🔍 check and update if a newer version exists\ngvm upgrade --force      # 🔄 reinstall the latest even if already up to date\ngvm upgrade --retries 5  # retry up to 5 times on error\n```\n\n\u003e 🔒 On Unix the replacement is **atomic** (same-filesystem rename). On Windows the old binary is renamed first to free its name, then the new binary takes the original path. A rollback is attempted automatically if the replacement fails.\n\n---\n\n### 💣 `gvm implode [--force]`\n\n**Completely removes gvm** and everything it manages from the system.\n\n```sh\ngvm implode           # 🗑️ shows a summary, asks for confirmation\ngvm implode --force   # 💥 removes everything immediately, no questions asked\n```\n\nWhat gets removed:\n\n- 📁 The entire `~/.gvm/` data directory (all installed Go versions)\n- 🔧 The `gvm` binary itself\n- 🐚 Every gvm-managed line from your interactive shell profile (`~/.bashrc`, `~/.zshrc`, PowerShell profile, etc.)\n- 🔑 The static PATH entry from your login profile (`~/.profile`, `~/.zprofile`) on Linux/macOS\n- 🗝️ The gvm entries from the Windows user PATH registry key (`HKCU\\Environment`) on Windows\n\n\u003e ⚠️ This operation is **irreversible**. Your installed Go versions will be deleted. Use `gvm upgrade` instead if you just want to update.\n\n---\n\n### 🏁 `gvm completions \u003cshell\u003e`\n\nPrints a shell completion script to stdout.\n\n```sh\n# 🐧 Bash\ngvm completions bash \u003e ~/.local/share/bash-completion/completions/gvm\n\n# 🐚 Zsh\ngvm completions zsh \u003e \"${fpath[1]}/_gvm\"\n\n# 🐟 Fish\ngvm completions fish \u003e ~/.config/fish/completions/gvm.fish\n\n# 🪟 PowerShell\ngvm completions powershell \u003e\u003e $PROFILE\n```\n\n---\n\n## 🔢 Version Syntax\n\nAll commands that accept a version support these forms:\n\n| Input      | Meaning                               |\n| ---------- | ------------------------------------- |\n| `latest`   | 🆕 Newest stable release              |\n| `1.22`     | 🔢 Latest installed patch of Go 1.22  |\n| `1.22.4`   | 🎯 Exact version go1.22.4             |\n| `go1.22.4` | ✅ Same as `1.22.4` (prefix accepted) |\n\n---\n\n## 📌 Per-project Versions\n\nPlace a `.go-version` file in any directory:\n\n```\ngo1.22.4\n```\n\ngvm walks up the directory tree from the current working directory (up to 20 levels) looking for `.go-version`. When found, it takes precedence over the global default.\n\n\u003e 🔗 The file is compatible with other tools such as [goenv](https://github.com/syndbg/goenv) and the VS Code Go extension.\n\n---\n\n## 🐚 Shell Integration\n\nAfter running `gvm setup`, two things are configured in your shell:\n\n**1. Interactive profile** - the `gvm env` hook, injected once by `gvm setup`:\n\n| Shell         | Profile file                              | Hook                                                            |\n| ------------- | ----------------------------------------- | --------------------------------------------------------------- |\n| 🐧 Bash       | `~/.bashrc`                               | `eval \"$(gvm env --shell bash)\"`                                |\n| 🐚 Zsh        | `~/.zshrc`                                | `eval \"$(gvm env --shell zsh)\"`                                 |\n| 🐟 Fish       | `~/.config/fish/config.fish`              | `gvm env --shell fish \\| source`                                |\n| 🪟 PowerShell | `~/Documents/PowerShell/profile.ps1`      | `gvm env --shell powershell \\| Out-String \\| Invoke-Expression` |\n\nOn every new interactive shell session the hook:\n\n1. 🔍 Reads the active version (`.go-version` → global default)\n2. ➕ Prepends the version's `bin/` directory to `PATH`\n3. 📂 Sets `GOROOT` to the version's root directory\n\n**2. Login profile / registry** - a static PATH entry so GUI apps find Go:\n\n| Platform | Where | What |\n| -------- | ----- | ---- |\n| 🐧 Linux (bash) | `~/.profile` | `export PATH=\"$HOME/.gvm/current/bin:$PATH\"` |\n| 🐚 Linux (zsh) | `~/.zprofile` | `export PATH=\"$HOME/.gvm/current/bin:$PATH\"` |\n| 🪟 Windows | `HKCU\\Environment` | gvm dir + `~\\.gvm\\current\\bin` added to user PATH |\n\nThis login profile entry is what makes `go` visible to VSCode, GoLand, and other GUI editors that launch outside of an interactive shell session.\n\n\u003e 🔇 No daemons, no background processes, no side effects.\n\n---\n\n## ⚙️ Configuration\n\n| Variable  | Default  | Description                        |\n| --------- | -------- | ---------------------------------- |\n| `GVM_DIR` | `~/.gvm` | 📁 Root directory for all gvm data |\n\n### 📂 Directory layout\n\n```\n~/.gvm/\n├── version          # active global version (plain text)\n├── current -\u003e versions/go1.23.0/   # symlink/junction updated by gvm use\n├── versions/\n│   ├── go1.22.4/    # extracted Go toolchain\n│   │   ├── bin/\n│   │   ├── src/\n│   │   └── ...\n│   └── go1.23.0/\n└── tmp/             # download staging area (cleaned after install)\n```\n\nThe `current` symlink (junction on Windows) always points to the active version. The login profile PATH entry points to `~/.gvm/current/bin`, which means GUI applications always see whichever version was last activated with `gvm use` - no shell restart required.\n\n---\n\n## 🛠️ Building from Source\n\nRequires [Rust](https://rustup.rs) 1.75 or newer. No system dependencies - TLS is handled by [rustls](https://github.com/rustls/rustls) (pure Rust, no OpenSSL needed).\n\n```sh\ngit clone https://github.com/jhonsferg/gvm-rs.git\ncd gvm-rs\ncargo build --release\n```\n\nThe binary is placed at `target/release/gvm` (or `gvm.exe` on Windows).\n\n```sh\n# ✅ Run the self-check after building\n./target/release/gvm doctor\n```\n\n---\n\n## 📦 Release Artifacts\n\nReleases are automated via GitHub Actions. Pushing a version tag triggers cross-compilation for all supported targets:\n\n| Artifact                 | Target                       | Notes            |\n| ------------------------ | ---------------------------- | ---------------- |\n| `gvm-windows-x86_64.exe` | `x86_64-pc-windows-msvc`     |                  |\n| `gvm-linux-x86_64`       | `x86_64-unknown-linux-musl`  | ⚡ static binary |\n| `gvm-linux-aarch64`      | `aarch64-unknown-linux-musl` | ⚡ static binary |\n| `gvm-darwin-x86_64`      | `x86_64-apple-darwin`        |                  |\n| `gvm-darwin-aarch64`     | `aarch64-apple-darwin`       | 🍎 Apple Silicon |\n\nEach release also includes `checksums.txt` with SHA-256 hashes for all artifacts, plus SBOM files in CycloneDX and SPDX formats.\n\nReleases are created automatically: every merge to `main` that passes CI triggers the auto-tag-and-release job, which bumps the version based on conventional commit prefixes (`feat` -\u003e minor, `fix` -\u003e patch) and dispatches the release build.\n\n---\n\n## 📄 License\n\nMIT - see [LICENSE](LICENSE).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nMade with 🦀 Rust · Maintained with ❤️\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjhonsferg%2Fgvm-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjhonsferg%2Fgvm-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjhonsferg%2Fgvm-rs/lists"}