Go install fails with error: no install location for directory xxx outside GOPATH

~/src/go-statsd-client> echo $GOPATH
/Users/me/gopath
~/src/go-statsd-client> echo $GOROOT
/usr/local/Cellar/go/1.1.1\
~/src/go-statsd-client> go install
go install: no install location for directory /Users/me/src/go-statsd-client outside GOPATH

No matter what structure the project is in this always fails with the same message. Go build works perfectly.

Here is my go env

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/me/gopath"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.1.1"
GOTOOLDIR="/usr/local/Cellar/go/1.1.1/pkg/tool/darwin_amd64"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"
CGO_ENABLED="1"

This is on Mac OSX Mountain Lion and go was installed with homebrew.

130945 次浏览

您正在 GOPATH 文件夹之外的目录上使用 去安装吧。 设置您的 GOBIN env 变量,或移动 GOPATH 内的 Src文件夹。

GOPATH/
bin/
src/
go-statsd-client/

更多信息: 构建源代码,296行

当你没有提供参数到 go install,它默认尝试在工作目录中安装软件包。错误信息告诉你它不能这样做,因为工作目录不是你的 ABc1的一部分。

你可以选择:

  • 定义 $GOPATH到 $HOME (export GOPATH=$HOME)。
  • 将源移动到当前 $GOPATH(mv ~/src/go-statsd-client /User/me/gopath)内。

之后,进入 go-statsd-client目录并键入 go install将起作用,从文件系统的任何地方键入 go install go-statsd-client也将起作用。构建的二进制文件将进入 $GOPATH/bin

作为一个不相关的建议,您可能希望使用域名给包命名空间,以避免名称冲突(例如 github.com/you/go-statsd-client,如果这是您保存源代码的地方)。

我在 Windows 上遇到了这个问题。

我的问题是我的 ABc0环境变量被设置成

C:\Users\john\src\goworkspace

而不是

C:\Users\john\src\goworkspace\

在末尾加上缺少的斜杠,我就修复了它。

对于任何 OS X 用户和未来的我,您还需要设置 GOBIN,以避免在安装和 go get时出现这种令人困惑的消息

mkdir bin
export GOBIN=$GOPATH/bin

在我的情况下(OS X) ,这是因为我已经将 GOPATH设置为 /home/username/go(根据书)而不是 /Users/username/go

您需要在所选的 GOPATH 目录中包含3个目录。

GOPATH
/bin
/src
/someProgram
program.go
/someLibrary
library.go
/pkg

然后,您将从 some Program (将一个可执行文件放入 bin 中)或 some Library (将一个库放入 pkg 中)内部运行 go install

您需要同时设置 GOPATHGOBIN。请确保您已经做了以下工作(请将 ~/go替换为您首选的 GOPATH,并随后更改 GOBIN)。这是在 Ubuntu 16.04 LTS上测试的。

export GOPATH=~/go


mkdir ~/go/bin


export GOBIN=$GOPATH/bin

所选择的答案并没有为我解决这个问题。

我在 Windows 上,我通过给 cmd 命令 go help gopath得到它,并且读取指令中的粗体文本,

也就是说,如果要安装的代码位于 ..BaseDir...\SomeProject\src\basic\set,那么 GOPATH不应该与代码位于同一位置,它应该只是基础项目 DIR: ..BaseDir...\SomeProject

GOPATH 环境变量列出了查找 Go 代码的位置 Unix 中,该值是一个冒号分隔的字符串 分号分隔的字符串。在方案9中,该值是一个列表。

如果环境变量未设置,GOPATH 默认为 用户主目录中名为“ go”的子目录($HOME/go on Unix,% USERPROFILE% Go on Windows) ,除非该目录包含 Go 运行“ go env GOPATH”查看当前 GOPATH。

请参见 https://golang.org/wiki/SettingGOPATH设置自定义 GOPATH。

在 GOPATH 列出的每个目录必须有一个规定的结构:

Src 目录保存源代码 导入路径或可执行文件名。

Pkg 目录保存已安装的包对象, 每个目标操作系统和体系结构对都有自己的 Pkg 的子目录(pkg/GOOS _ GOARCH)。

如果 DIR 是 GOPATH 中列出的目录,则包的源代码位于 DIR/src/foo/bar 可以作为“ foo/bar”导入,并具有其编译后的形式 安装到“ DIR/pkg/GOOS _ GOARCH/foo/bar.a”。

Bin 目录包含已编译的命令 它的源目录,但只是最后一个元素,而不是整个路径。 也就是说,将包含 DIR/src/foo/quux 中的源代码的命令安装到 DIR/bin/quux,而不是 DIR/bin/foo/quux 您可以将 DIR/bin 添加到 PATH 中以获取安装的 命令。如果设置了 GOBIN 环境变量,命令就是 安装到它命名的目录,而不是 DIR/bin. GOBIN 必须是 一条绝对的道路。

下面是一个目录布局示例:

GOPATH=/home/user/go


/home/user/go/
src/
foo/
bar/               (go code in package bar)
x.go
quux/              (go code in package main)
y.go
bin/
quux                   (installed command)
pkg/
linux_amd64/
foo/
bar.a          (installed package object)

..........

如果 GOPATH 已经设置为 BaseProjectDIR 并且仍然存在此问题,那么在窗口中可以尝试将 戈宾设置为 Base Project DIR\bin%GOPATH%\bin

在 windows 中,当我设置 GOPATH 环境变量时,cmd 窗口已经打开。 首先,我必须关闭 cmd,然后重新开放,以使其生效。

无论如何,这是我的。Bash _ profile,在我使用 Atom 的 Mac 上运行良好,在安装之后使用 Homebrew:

export GOROOT=`go env GOROOT`
export GOPATH=/Users/yy/Projects/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN

在 OSX Mojave 10.14上,go是安装在 /usr/local/go上的 一般来说

因此,设置这些 ENV,应该就可以了。

export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin

另外,如果有效的话,把它们添加到你的 bash_profile或者 zsh_profile

echo "export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin" >> ~/.bash_profile && source ~/.bash_profile

跑的时候小心点

export GOPATH=$HOME

假设您的代码存在于与 GOPATH相关的特定位置。因此,您可以使用 docker 来运行任何 go 命令:

docker run -it -v $(pwd):/go/src/github.com/<organization name>/<repository name> golang

现在您可以使用任何 golang 命令,例如:

go test github.com/<organization name>/<repository name>