Golang itself bundles a toolchain and can cross compile to a many target OSes and architectures. I use Goreleaser [1] to create GitHub releases, Homebrew packages, Docker images, and Linux packages. Goreleaser Pro can also create MSI packages.
ETA since I just saw Christian chime in: the Goreleaser author works at Charm.sh =)
I feel your pain. That said, cross compiling from Go is pretty trivial, as long as everything is pure Go, which it most often is. That’s one if the reasons we invested in jt.
(Hello from Charm! I’m one of the authors of this library.)
Wow TIL cross compilation is a bit of a pain in Rust. I assumed it was as easy as Go. I can confirm as long as you're using pure Go (no cgo), it's as easy as setting $GOOS and $GOARCH appropriately.
The difficulty is due to Rust dynamically linking and Go statically linking. The former requires the system libs.
That said, I am unfamiliar with any licensing for Windows builds.
MacOS has some niche (usually discarded) technicalities like you can only use the SDK on Apple hardware.
I looked into how rust does does it for rustup, and they have a pretty amazing set of gh actions to build for their architectures, I can't find the GH link now tho
for speed you can look for vendors like https://depot.dev/
This is great, lots I learned by looking at your code and the dependencies you use!
I started a similar thing, although not as feature-rich as yours. My goal was to follow CLI best practices and add all the boilerplate one needs to build a Rust CLI.
Throughout these years, I have found that cross-compiling is the most challenging part of creating a CLI. When you are building a web back-end, you control the execution environment (usually linux). For CLIs, your users could be on Linux, macOS or Windows. You need to get three x2 binaries (so a total of 6) to have a fair coverage.
I’ve tried cross, but for Windows and macOS you need licenses. There is no straightforward way to give your users Docker images and have them running in a few commands. You can compile on GitHub action machines, but that’s a very slow feedback loop. I wonder if things are better in Go land.
!: https://github.com/rust-starter/rust-starter