{"record":{"id":"8f596c621cda5188","repo":"golang/go","slug":"gopath-entry-is-relative-must-be-absolute-path","errorCode":null,"errorMessage":"GOPATH entry is relative; must be absolute path: %q","messagePattern":"GOPATH entry is relative; must be absolute path: %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cmd/go/internal/envcmd/env.go","lineNumber":671,"sourceCode":"\t\treturn fmt.Errorf(\"unknown go command variable %s\", key)\n\t}\n\n\t// Some variables can only have one of a few valid values. If set to an\n\t// invalid value, the next cmd/go invocation might fail immediately,\n\t// even 'go env -w' itself.\n\tswitch key {\n\tcase \"GO111MODULE\":\n\t\tswitch val {\n\t\tcase \"\", \"auto\", \"on\", \"off\":\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid %s value %q\", key, val)\n\t\t}\n\tcase \"GOPATH\":\n\t\tif strings.HasPrefix(val, \"~\") {\n\t\t\treturn fmt.Errorf(\"GOPATH entry cannot start with shell metacharacter '~': %q\", val)\n\t\t}\n\t\tif !filepath.IsAbs(val) && val != \"\" {\n\t\t\treturn fmt.Errorf(\"GOPATH entry is relative; must be absolute path: %q\", val)\n\t\t}\n\tcase \"GOMODCACHE\":\n\t\tif !filepath.IsAbs(val) && val != \"\" {\n\t\t\treturn fmt.Errorf(\"GOMODCACHE entry is relative; must be absolute path: %q\", val)\n\t\t}\n\tcase \"CC\", \"CXX\":\n\t\tif val == \"\" {\n\t\t\tbreak\n\t\t}\n\t\targs, err := quoted.Split(val)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid %s: %v\", key, err)\n\t\t}\n\t\tif len(args) == 0 {\n\t\t\treturn fmt.Errorf(\"%s entry cannot contain only space\", key)\n\t\t}\n\t\tif !filepath.IsAbs(args[0]) && args[0] != filepath.Base(args[0]) {\n\t\t\treturn fmt.Errorf(\"%s entry is relative; must be absolute path: %q\", key, args[0])","sourceCodeStart":653,"sourceCodeEnd":689,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/cmd/go/internal/envcmd/env.go#L653-L689","documentation":"Returned by checkEnvWrite when a GOPATH entry is non-empty and not absolute (filepath.IsAbs returns false). Relative GOPATH entries would resolve against the go command's working directory, producing unstable module/binary locations, so they are rejected at write time.","triggerScenarios":"`go env -w GOPATH=./go`, `go env -w GOPATH=go`, or any non-empty relative entry inside a colon-separated GOPATH.","commonSituations":"Project-local GOPATH attempts; CI scripts that cd before invoking `go env -w` with a relative path; users copying tutorial examples that omit the leading slash.","solutions":["Resolve to an absolute path before writing: `go env -w GOPATH=$(pwd)/.gopath`.","Use $HOME-relative absolute paths such as `go env -w GOPATH=$HOME/go`.","On multi-entry GOPATH, make sure every entry is absolute."],"exampleFix":"# before\n$ go env -w GOPATH=./gopath\nerror: GOPATH entry is relative; must be absolute path\n# after\n$ go env -w GOPATH=\"$PWD/gopath\"","handlingStrategy":"validation","validationCode":"import \"path/filepath\"\n\nfunc ensureAbsGopath(v string) (string, error) {\n    if v == \"\" || filepath.IsAbs(v) { return v, nil }\n    abs, err := filepath.Abs(v)\n    if err != nil { return \"\", err }\n    return abs, nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Resolve paths to absolute before `go env -w`.","For multi-entry GOPATH, normalise every entry independently.","Prefer $HOME-relative absolute paths in shared configs."],"tags":["config","env","gopath","validation","filesystem"],"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-12T08:17:17.861Z"}