Maison >développement back-end >Golang >Nix : les packages go en mode --pure pointent toujours vers le GOPATH de l'hôte

Nix : les packages go en mode --pure pointent toujours vers le GOPATH de l'hôte

WBOY
WBOYavant
2024-02-15 09:27:081123parcourir

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

l'éditeur php Strawberry est là pour vous présenter le problème du package go dans Nix --mode pur pointant vers le GOPATH de l'hôte. Dans Nix, le mode --pure est un environnement propre qui ne repose pas sur les variables d'environnement et les paramètres de chemin de l'hôte. Cependant, certains utilisateurs ont constaté que l'utilisation du package go en mode --pure pointe toujours vers le GOPATH de l'hôte. En effet, le package go en mode --pure n'est pas complètement indépendant de l'environnement hôte. Il dépendra toujours dans une certaine mesure du paramètre GOPATH de l'hôte. Pour cette question, nous devons mieux comprendre comment fonctionne Nix et comment configurer correctement l'environnement.

Contenu de la question

J'essaie d'utiliser le package go pour exécuter un shell nix afin de tester le programme go. Cependant, pour garantir la reproductibilité, je ne souhaite pas accéder à nix-shell pour pointer vers des chemins ou des informations liés à l'hôte. Par conséquent, on m'a conseillé d'utiliser le drapeau --pure dans la commande.

Ma commande finale ressemble à ceci :

$ nix-shell --pure -p go
Après le démarrage du

shell, je cours go env et vois ce qui suit :

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"

Je souhaite installer mon projet go de manière reproductible sans utiliser l'hôte hérité gopath et d'autres variables d'environnement associées.

Existe-t-il un moyen de séparer complètement les dépendances du système hôte en installant le package nix go dans le shell, puis en testant le projet go ?

Solution

Même si les variables d'environnement sont GOPATH, GOENV, GOMODCACHE, &c. Pas défini du tout, GOPATHGOENVGOMODCACHE、&c。 完全未设置go env和相关工具合成相对于$HOME et les outils associés synthétisent la valeur par défaut relative à $HOME.

Donc, si vous souhaitez vérifier régulièrement que votre projet n'a pas de dépendances cachées sur votre répertoire personnel, vous devez envelopper sa construction dans un fork Nix ; en supposant que vous êtes sur une plate-forme sur laquelle Nix prend en charge le sandboxing et que cette fonctionnalité est activée, cela provoquera le build pour terminer dans le bac à sable sans accès à votre répertoire personnel.

Voir gomod2nix et l'entrée Go plus générale sur nixos.wiki pour obtenir des conseils sur la création de forks pour envelopper les builds de programmes.

Veuillez également noter nix-shell --pure 不会创建在任何意义上都是纯粹的 shell:仍然依赖于来自本地渠道的 nixpkgs。如果你想控制它,你需要一个 shell.nixflake.nix pour épingler des versions nixpkgs spécifiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer