Years in the past, Go began having bother compiling and putting in functions on native Home windows environments (Command Immediate, PowerShell, not Cygwin-like or WSL environments).
The go mod vendor
system generally malfunctions in Home windows. go set up [./...]
studies an incapability to look within the vendor
listing to meet import dependencies.
In an try and resolve this, the consumer might attempt to run go clear -modcache
. Nevertheless, that command fails on account of quirks for Home windows customers, in addition to quirks for customers who replace Go variations. The truth is, operating go clear -modcache
each fails, and in addition triggers go set up [./...]
to generate much more errors than earlier than, since a damaged go clear -modcache
leaves the $GOPATH/pkg
tree in such a poor state.
From Go 1.15 onward, a clumsy, opt-in GODEBUG=modcacheunzipinplace=1
atmosphere variable configuration is required to Home windows Go software contributors to get instructions like go clear -modcache
and go set up ./...
to succeed. Then, functions are in a position to construct in Home windows (with exactly the identical git contents for vendor/
as earlier than).
That’s not an intuitive conduct out of the field. Let’s enhance Go, in order that Home windows customers could make use of the vendor
system, with out having to waste time troubleshooting errors and altering the default Go configuration.
One technique to scale back danger of corruption between Go variations, is to mark the pkg listing with a helper file like $GOPATH/pkg/.go-touch
to point the model of Go that final wrote to the listing tree. We might backport error dealing with to current warnings, or higher but, errors, within the occasion that an incompatible Go model tries to learn or write from the listing tree. The incompatible variations would nonetheless be incompatible, however with safer error dealing with, in a method that empowers us to advertise GODEBUG=modcacheunzipinplace=1
as the brand new default conduct, a minimum of in Home windows.
That being stated, I acknowledge that we wish to not break previous variations of Go wherever doable. To that finish, one other grander choice is feasible: Transfer the pkg
location from $GOPATH/pkg
to $GOPATH/<go-version>/pkg
. Provided that sure packages like x/instruments linters typically break API’s anyway, it appears cheap to cease reusing a single world location for this listing. Make it relative to the Go model for security and future compatibility.
Go 1.24 might do that. Or Go 1.25. With out sacrificing backwards compatibility with outdated, insecure Go variations.
In ASDF, that is maybe much less of a difficulty, not simply because ASDF is primarily a UNIX, non-Home windows model supervisor; But in addition as a result of ASDF tends to robotically nest many Go parts inside version-relative directories…
Maybe that is doable with some snippets within the (fragile) psenv system, although that’s just for PowerShell, not Command Immediate.
Maybe that is doable with direnv, which if reminiscence serves has been prototyping some sort of Home windows (PowerShell?) help in the end.
Ideally, such enhancements are made instantly in Go, obtainable to as many coders and environments as doable.