{"id":22854571,"url":"https://github.com/patricktcoakley/gdvm","last_synced_at":"2025-05-07T06:46:40.313Z","repository":{"id":265583523,"uuid":"896238164","full_name":"patricktcoakley/gdvm","owner":"patricktcoakley","description":"A friendly Godot version manager.","archived":false,"fork":false,"pushed_at":"2025-03-28T01:44:01.000Z","size":764,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-07T06:46:35.868Z","etag":null,"topics":["csharp","dotnet","godot","godot-engine","version-manager"],"latest_commit_sha":null,"homepage":"","language":"C#","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/patricktcoakley.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-29T21:09:43.000Z","updated_at":"2025-03-28T01:44:04.000Z","dependencies_parsed_at":"2024-11-30T02:27:54.871Z","dependency_job_id":"594d9b12-1a14-4d6c-8855-f9e737942e99","html_url":"https://github.com/patricktcoakley/gdvm","commit_stats":null,"previous_names":["patricktcoakley/gdvm"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Fgdvm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Fgdvm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Fgdvm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patricktcoakley%2Fgdvm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patricktcoakley","download_url":"https://codeload.github.com/patricktcoakley/gdvm/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252831178,"owners_count":21810779,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["csharp","dotnet","godot","godot-engine","version-manager"],"created_at":"2024-12-13T07:07:26.256Z","updated_at":"2025-05-07T06:46:40.296Z","avatar_url":"https://github.com/patricktcoakley.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gdvm\n\nA work-in-progress Godot version manager **(gdvm)**. [GVM](https://github.com/moovweb/gvm) was taken.\n\n![sizzler](./assets/gdvm.gif)\n\n## Features\n\ngdvm is a friendly Godot version manager that lets users install multiple versions of Godot with ease. It uses a hybrid CLI/TUI design,\nmeaning that in places when you don't supply an argument it falls back to a prompt to let you select what you're looking for,\nas well as support for [passing it keywords](#usage) to help find the appropriate version based on your input, like `4 dev` or `latest`.\nIt's released as a static binary that can work on Windows, macOS, and Linux by just putting it somewhere and calling it in the\nterminal, or more conveniently, by using a [package manager](#installation).\n\nWhile gdvm is primarily targeting users that just want an easy way to maintain Godot installations or make it is to try out different versions,\nanother use case could be for things like remote installations, such as CI or server workloads, or even for WSL or containers. This could make running\nautomated tests or headless work much easier than having to rely on your OS package manager or having to rely on simple scripts since the only requirement\nis to have the single binary, which clocks in around ~10MB.\n\nAt this point it is mostly feature-complete, so ongoing work will mostly focus on what's on the [roadmap](#roadmap).\n\n## Installation\n\nCurrently, there are a few ways to install gdvm. Aside from the package managers listed below, [zipped Windows and Linux binaries](https://github.com/patricktcoakley/gdvm/releases) are going to be uploaded after\na release (see [macOS](#macos) for reasons why it is omitted). Most people will probably want to use a package manager,\nso I've tried to make it easy by having both Scoop and Homebrew packages available. There is also [gdvmup](#gdvmup) for Windows users who don't want to use Scoop. This tool\n is meant to handle all installation and management of the gdvm tool itself, much like a package manager would.\n\n### Homebrew\n\nUsing [Homebrew](https://brew.sh), you simply need to add my [formulae](https://github.com/patricktcoakley/homebrew-forumlae) repo, like so:\n\n```shell\nbrew tap patricktcoakley/formulae\nbrew install gdvm\n```\n\n### Scoop\n\nUsing [scoop](https://scoop.sh), you simply need to add my [bucket](https://github.com/patricktcoakley/scoop-bucket) repo, like so:\n\n```shell\nscoop bucket add patricktcoakley https://github.com/patricktcoakley/scoop-bucket\nscoop install patricktcoakley/gdvm\n```\n\n\n### gdvmup\n\nThere is also an **experimental** tool called `gdvmup` that can manage your installations on **Windows** using a Powershell script. I've only done preliminary testing and am open to feedback, but be aware things there may be issues. To try it out, you can do the following:\n\n```powershell\nirm https://raw.githubusercontent.com/patricktcoakley/gdvm/main/installer.ps1 | iex\n```\n\nwhich will install the latest version and add gdvmup, gdvm, and the Godot alias directories to your PATH automatically. gdvmup\ncan handle installation, upgrade, and deletion of the gdvm tool, but it's a WIP and may change or be integrated into the main application in the future.\n\nUsage:\n\n- `install` [`--quiet`] [`--version VERSION`] [`--force`] installs gdvmup and gdvm, with the optional arguments for quiet output, a specific version, or forcing an installation.\n- `uninstall` removes **everything**, including gdvm, gdvmup, and all Godot installations.\n- `upgrade` just reinstalls everything and will likely be removed in the future unless I can think of a use case.\n\nIf there is interest I will also consider a macOS/Linux version of this tool.\n\n\n### Linux\n\nIf there is interest in packaging for Linux distributions, please create an issue and I can investigate it.\n\n## Configuration\n\nOnce you've installed gdvm, there should be a `gdvm.ini` file located inside of the root `gdvm` directory. Currently, the only supported\nsetting is to set a [GitHub token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic) to disable\nrate limiting on queries and installations. In order to do so, you need to edit the `gdvm.ini` to look like the following:\n\n```ini\n[github]\ntoken = \"\u003cMY_SUPER_SECRET_TOKEN\u003e\"\n```\n\nwhich allows you to use `gdvm` without the [60 requests per hour restriction](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api?apiVersion=2022-11-28#primary-rate-limit-for-unauthenticated-users). There may be other use cases in the future, \nbut otherwise all functionality exists inside the CLI itself.\n\n## Usage\n\n### Getting Started\n\ngdvm downloads and installs Godot into folders inside of `~/gdvm/` for macOS and Linux, and `C:\\Users\\USERNAME\\gdvm\\` for Windows; this might be customizable in the future.\nEach installation will be in a folder with the `VERSION-TYPE-RUNTIME`. So if you installed the 4.3 stable with .NET support, it would be in a folder marked\n`4.3-stable-mono`. By default, when you install a version a [symlink](https://en.wikipedia.org/wiki/Symbolic_link) is created in a folder called `bin`. This is what the `gdvm godot` command is using by default,\nor you can run `gdvm godot -i` to pick any another installation to launch, or you can simply use `gdvm set` to pick the version you want to launch by default.\nThis command was added to not have to rely on having your `PATH` variable set to use symlinks. You can also just drag the symlink to your taskbar or dock (depending on your OS and desktop environment)\nfor easy launching through icons; for macOS you would specifically use `.app`. However, if you'd like to be able to just run `godot` from the terminal directly, see [here](#path) for basic instructions\n\nRight now it supports installing whatever your computer supports by CPU and OS, so if you're running Windows on a standard x86-standard CPU you are able to install\nand run versions of Godot all the way back to 1.x. macOS went through multiple architecture transitions since Godot 1 and so most modern Macs will only support releases\nas far back as ~3.3, but if you have an older Mac you should still be able to install whatever it supports. An override to force downloads on unsupported systems\nmay be added later.\n\n### Commands\n\n![install](./assets/gdvm-install.jpg)\n\n- `gdvm list`  will list locally installed Godot versions.\n- `gdvm install [--query|-q \u003c...strings\u003e]` will prompt the user to install a version if no arguments are supplied, or will\n  try to find the closest matching version based on the query, defaulting to \"stable\" if no other release type is supplied. \n  It will also set the last installed version as the default.\n  - Queries:\n    - `latest` or `latest standard` will install the latest stable, and `latest mono` will install the latest .NET stable.\n    - `4 mono` will grab the latest stable 4.x .NET release, `3.3 rc` will grab the latest rc of 3.3 standard, `1` would take the last stable version `1`, and so on.\n- `gdvm godot [--interactive|-i, args \u003cstring\u003e]` run the set Godot version, or with the `--interactive` or `-i` flag, will prompt the user to launch an installed version.\n  - Optionally, pass some arguments in, such as `--headless`.\n- `gdvm set [--query \u003c...strings\u003e]` prompts the user to set an installed version of Godot if no arguments are supplied, or will\n  try to find the closest matching version based on the query, including release type (`stable`) and version (`4`, `4.4`), or an exact match (`4.4.1-stable-mono`).\n- `gdvm which` displays the location that the current Godot symlink points to.\n- `gdvm remove [\u003cstring\u003e]` prompts the user to select multiple installations to delete, or optionally takes a query to filter down to specific versions\n  - For example, if you wanted to list all of the `4.y.z` versions to remove, you could jut do `gdvm remove 4` to list all of the 4 major releases.\n- `gdvm logs [--level|-l \u003cstring\u003e, --message|-m \u003cstring\u003e`] displays all the of the logs, or optionally takes a level or message filter.\n- `gdvm search [--query|-q \u003c...strings\u003e]` takes an optional query to search all available remote versions of Godot.\n  - Queries:\n    - `4` would filter all 4.x releases, including \"stable\", \"dev\", etc.\n    - `4.2-rc` would only list the `4.2` `rc` releases, but `4.2 rc` would list all `4.2.x` releases with the `rc` release type, including `4.2.2.-rc3`\n\n## Notes\n\n### Windows\n\nIn order to use the symlink feature for Windows, you first need to enable [Developer Mode](https://learn.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development).\nWithout it, you can still install, remove, etc, but you won't have the added benefit of having a symlink pointing to your desired version.\n\n### macOS\n\nI originally planned to supply .zip files for macOS too, and while I was able to automate code signing and notarization using my Apple Developer account,\nit doesn't really make sense to go through the process when Homebrew exists since there are too many issues with Gatekeeper to justify it right now,\nand there are many options to build from source already.\n\n### PATH\n\n\u003e **_NOTE:_** If you use [gdvmup](#gdvmup), [Scoop](#scoop), or [Homebrew](#homebrew), this is not an issue and only relates to using the zipped binaries.\n\nThere currently isn't a built-in way to add the binaries to your `PATH` right, but it's very straightforward to do if you aren't familiar. If you're on Windows, you can generally\njust follow [this](https://learn.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ee537574(v=office.14)). Otherwise, for macOS and Linux, if you're using zsh or bash you should be able to just open your `~/.profile` and add `export PATH=\"$PATH:$HOME/gdvm/bin\"` and then `source ~/.profile`.\n\n## Build\n\nIn order to build this project, you just need the .NET 9 SDK. Running `dotnet run -- \u003ccommand\u003e [args]` will let you run commands immediately, but you can also run `dotnet build -c Release` to get a release build and just copy to a directory in your PATH.\n\nYou might see some warnings for trimming with AOT, but in my testing I have not encountered any issues since I don't rely on the functionality it is warning against.\n\n## Roadmap\n\n- Re-work the rest of the file management code to make it more testable by having overrides, which would also allow for custom install paths.\n- Get some working e2e tests, including searching, installing, setting, launching, and removing a specific version.\n- Possibly consider adding multi-select and multi-query to installations so that you could bulk-install multiple versions.\n- I currently have [gdvmup](#gdvmup) for Windows, and it would make sense to port that script to bash for macOS and Linux support, allowing users to more easily install gdvm without having to rely on a package manager, but at the cost of extra maintenance and overhead.\n\n## FAQ\n\n- **Why another version manager?**\n  - I mostly created this as an experiment to play with how a command-line tool experience could be improved, and my\n    goal is to make it easy to use, even for people who don't have a lot of terminal experience. I plan to mostly use it\n    as a place to try out new ideas or add unique features.\n- **Why C# and not a script, or Rust, Go, etc?**\n  - I have written command-line tools in various languages, including Bash, Python, Powershell, Go, TypeScript, and Rust, but I wanted to explore modern .NET tooling and infrastructure, including NativeAOT static binaries and CLI/TUI libraries. I think modern .NET provides a pretty great platform to create developer tooling.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatricktcoakley%2Fgdvm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpatricktcoakley%2Fgdvm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatricktcoakley%2Fgdvm/lists"}