php-Editor Strawberry ist hier, um Ihnen das Problem des Go-Pakets im Nix-Pure-Modus vorzustellen, das auf den GOPATH des Hosts verweist. Unter Nix ist der --pure-Modus eine saubere Umgebung, die nicht auf den Umgebungsvariablen und Pfadeinstellungen des Hosts basiert. Einige Benutzer haben jedoch festgestellt, dass die Verwendung des go-Pakets im --pure-Modus immer noch auf den GOPATH des Hosts verweist. Dies liegt daran, dass das go-Paket im --pure-Modus nicht völlig unabhängig von der Hostumgebung ist. Es hängt dennoch bis zu einem gewissen Grad von der GOPATH-Einstellung des Hosts ab. Für diese Frage müssen wir besser verstehen, wie Nix funktioniert und wie die Umgebung richtig konfiguriert wird.
Ich versuche, das Go-Paket zu verwenden, um eine Nix-Shell auszuführen, um das Go-Programm zu testen. Um die Reproduzierbarkeit sicherzustellen, möchte ich jedoch nicht, dass „go in nix-shell“ auf hostbezogene Pfade oder Informationen verweist. Daher wurde mir empfohlen, im Befehl das Flag --pure
zu verwenden.
Mein letzter Befehl sieht so aus:
$ nix-shell --pure -p go
Shell gestartet ist, führe ich go env
aus und sehe Folgendes:
GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/HOSTUSERNAME/.cache/go-build" GOENV="/home/HOSTUSERNAME/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/HOSTUSERNAME/go/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/HOSTUSERNAME/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/nix/store/a7875alzpnr46z6mv4ssymfdwmvr6xbq-go-1.19.4/share/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/nix/store/a7875alzpnr46z6mv4ssymfdwmvr6xbq-go-1.19.4/share/go/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.19.4" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/dev/null" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/run/user/1000/go-build3633664660=/tmp/go-build -gno-record-gcc-switches"
Ich möchte mein Go-Projekt auf reproduzierbare Weise installieren, ohne Host Inherited gopath
und andere verwandte Umgebungsvariablen zu verwenden.
Gibt es eine Möglichkeit, die Abhängigkeiten des Hostsystems vollständig zu trennen, indem man das Nix-Go-Paket in der Shell installiert und dann das Go-Projekt testet?
Auch wenn die Umgebungsvariablen GOPATH
, GOENV
, GOMODCACHE
usw. sind. Überhaupt nicht festgelegt, GOPATH
、GOENV
、GOMODCACHE
、&c。 完全未设置,go env
和相关工具合成相对于$HOME
und verwandte Tools synthetisieren den Standardwert relativ zu $HOME
.
Wenn Sie also regelmäßig testen möchten, dass Ihr Projekt keine versteckten Abhängigkeiten von Ihrem Home-Verzeichnis hat, sollten Sie seinen Build in einen Nix-Fork einschließen. Vorausgesetzt, Sie befinden sich auf einer Plattform, auf der Nix Sandboxing unterstützt und diese Funktion aktiviert ist Erstellen Sie den Build, um ihn in der Sandbox abzuschließen, ohne Zugriff auf Ihr Home-Verzeichnis.
Siehe gomod2nix und den allgemeineren Go-Eintrag auf nixos.wiki für Anleitungen zum Erstellen von Forks zum Umschließen von Programm-Builds.
Bitte beachten Sie auch nix-shell --pure
不会创建在任何意义上都是纯粹的 shell:仍然依赖于来自本地渠道的 nixpkgs。如果你想控制它,你需要一个 shell.nix
或 flake.nix
, dass Sie bestimmte Nixpkgs-Versionen anpinnen müssen.
Das obige ist der detaillierte Inhalt vonNix: Go-Pakete im --pure-Modus verweisen immer noch auf den GOPATH des Hosts. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!