Home  >  Article  >  Backend Development  >  Nix: go packages in --pure mode still point to the host's GOPATH

Nix: go packages in --pure mode still point to the host's GOPATH

WBOY
WBOYforward
2024-02-15 09:27:081108browse

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

php editor Strawberry is here to introduce to you the problem of the go package in Nix --pure mode pointing to the GOPATH of the host. In Nix, --pure mode is a clean environment that does not rely on the host's environment variables and path settings. However, some users have found that using the go package in --pure mode still points to the host's GOPATH. This is because the go package in --pure mode is not completely independent of the host environment. It will still depend on the host's GOPATH setting to a certain extent. For this question, we need to further understand how Nix works and how to configure the environment correctly.

Question content

I am trying to use the go package to run a nix shell to test the go program. However, to ensure reproducibility, I don't want go in nix-shell to point to any host-related paths or information. Therefore, I was advised to use the --pure flag in the command.

My final command looks like this:

$ nix-shell --pure -p go
After the

shell starts, I run go env and see the following:

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"

I would like to install my go project in a reproducible manner without using the host inherited gopath and other related environment variables.

Is there a way to completely separate the host system dependencies by installing the nix go package in the shell and then test the go project?

Solution

Even if the environment variables are GOPATH, GOENV, GOMODCACHE, &c. Not set at all , go env and related tools synthesize the default value relative to $HOME.

Therefore, if you want to regularly test that your project has no hidden dependencies on your home directory, you should wrap its build in a Nix fork; assuming you are on a platform where Nix supports sandboxing and this feature is enabled, This will cause the build to complete in the sandbox without access to your home directory.

See gomod2nix and the more general Go entry on nixos.wiki for guidance on building forks to wrap program builds.

Also, please note that nix-shell --pure does not create a shell that is pure in any sense: still relies on nixpkgs from the local channel. If you want to control this, you need a shell.nix or flake.nix to pin a specific nixpkgs version.

The above is the detailed content of Nix: go packages in --pure mode still point to the host's GOPATH. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete