Heim >Backend-Entwicklung >Golang >Nix: Go-Pakete im --pure-Modus verweisen immer noch auf den GOPATH des Hosts

Nix: Go-Pakete im --pure-Modus verweisen immer noch auf den GOPATH des Hosts

WBOY
WBOYnach vorne
2024-02-15 09:27:081126Durchsuche

Nix:--pure 模式下的 go 包仍然指向主机的 GOPATH

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.

Frageninhalt

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
Nachdem die

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?

Lösung

Auch wenn die Umgebungsvariablen GOPATH, GOENV, GOMODCACHE usw. sind. Überhaupt nicht festgelegt, GOPATHGOENVGOMODCACHE、&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.nixflake.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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen