未设置GOBIN:无法运行go install


86

我正在尝试为main.go文件安装自定义软件包。可是我跑的时候

go install custom.go

我得到这个错误

go install: no install location for .go files listed on command line (GOBIN not set)

如何设置GOBIN?


16
顺便说一句:这是安装软件包的完全错误的方法。这将永远行不通。go install安装软件包而不是单个文件。请阅读golang.org/cmd/go的所有内容,并了解如何设置文件。
Volker 2014年

感谢您的注意!
user3918985 2014年

2
我认为您正在寻找构建版本。
bunnybare 2014年

2
我不确定我是否同意这是完全错误的。设置GOBIN时,有两种不同的行为:使用go build <gofile.go>时,可执行文件在同一文件夹中创建。使用go install <gofile.go>时,可执行文件是在GOBIN中创建的。
Erez A. Korn

2
FWIW-要开始使用的默认文档建议您严格执行此操作。golang.org/doc/install
麦克Buckbee

Answers:


46

更新2020:自走1.11和引进围棋模块GOPATH不需要每个项目了,并默认为~/go全球工具/项目你会go get

Go 1.16(2020年第一季度)应默认GOBINGOPATH[0]/bin

但是就目前而言,对于任何使用模块的项目,您都不会再收到类似“ go install: no install location ...”的错误消息。


2014年原始答案:

检查您的GOPATH变量。
确保:

  • 您的资料来源 GOPATH/src
  • bin在GOPATH文件夹中有一个文件夹。

请参阅GOPATH环境变量(其中“ DIR”是GOPATH文件夹):

bin目录包含已编译的命令。
每个命令都以其源目录命名,但仅命名为最后一个元素,而不是整个路径。也就是说,将source in的命令DIR/src/foo/quux安装到DIR/bin/quux而不是中DIR/bin/foo/quux。在“ foo/”前缀被剥离,以便您可以添加DIR/bin到您PATH得到在安装命令。

如果GOBIN设置了环境变量,那么命令将安装到它命名的目录中,而不是安装在DIR/binGOBIN必须是绝对路径。


例如,该线程说明了在以下位置进行go构建的情况GOPATH/src

看起来您GOPATH已设置为,~/go但是您在go install上运行了命令~/dev/go

请参阅构建

Go路径是包含Go源代码的目录树的列表。咨询它来解决在标准Go树中找不到的导入。

如果您已完成操作go build,也可以尝试使用go install(no custom.go):您要安装软件包,而不是单个文件。


你是这个意思吗 我确实回显了$ PATH并得到了这个:/ Users / apple / bin:/ usr / bin:/ bin:/ usr / sbin:/ sbin:/ usr / local / bin:/ usr / local / git / bin:/ usr / local / go / bin:/ usr / local / mysql / bin
user3918985

76

我设置了GOBIN路径,对我有用

export GOBIN=[WorkspacePath]/bin

2
是的,这是正确的答案。只需在该GOPATH中创建/ bin
swdev

7
导出路径后,我得到了错误cannot install, GOBIN must be an absolute path:(
lee

@lee您使用了..还是~在指定的路径中?我遇到了这个错误,只是切换到诸如/home/ben/bin/甚至的绝对路径$HOME/bin/。我的完整命令是(在鱼壳中,转到v1.11)env GOBIN=$HOME/bin/ go install testfile.go
Benny Jobigan '19

40

作为初学者,我在尝试各种go命令(构建,运行和安装)时遇到了此错误。总之,你不能去安装一个filename.go。您只能安装软件包。

这很令人困惑,因为我了解到:

nate:~/work/src/dir $ go run hello/hello.go
hello, world.

效果很好。但是我不知道为什么安装不起作用:

nate:~/work/src/dir $ go install hello/hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

无论我在哪个目录中:

nate:~/work/src/dir $ cd hello
nate:~/work/src/dir/hello $ go install hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir/hello $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

这种混淆是因为go run 适用于Go源文件(文件名以.go结尾),而go install 接受软件包。程序包通过其导入路径或文件系统路径来命名。从而:

nate:~/work/src/dir $ go install dir/hello
nate:~/work/src/dir $ go install ./hello/
nate:~/work/src/dir/hello $ go install .

一切都很好。第一个通过导入路径引用该软件包(假设$ GOPATH =“ / home / nate / work”,go工具在/ home / nate / work / src中查找源代码),其他被解释为文件系统。路径,因为提前期。

另请参阅GOPATH文档


1
这是IMO的真正解决方案。go install适用于目录,如果您指定特定的go文件,则可能导致此特定问题。
–Senseiwu

13

实际上,有两种不同的行为。

go install <package>

这是在记录编译并安装软件包和依赖 你不需要GOBIN如果你正确设置GOPATH。

go install <gofile>

这没有记录,在这种模式下需要GOBIN env变量。


1
go install <gofile>是记录,在go help packages到其go install --help指。问题是go install(在1.9.2和更早版本中)具有不一致的行为,在一种情况下要求不一致,而在另一种情况下则不需要显式设置GOBIN。
StevoSlavić,

7

如先前的回答所指出的,如果将GOPATH env正确设置为工作空间,则无需设置GOBIN env变量。

请通过运行$ go env检查您的go环境变量| grep -i“ ^ GO”并查找GOROOT和GOPATH以检查GOROOT是否指向您的GO源安装以及GOPATH是否指向您的工作区。

如果一切正确,请导航至yourpkg.go所在的子目录,然后首先运行$ go build(不带文件名),然后再运行$ go install(再次使用我们的文件名),如果您在屏幕上没有看到任何错误消息,软件包已在您的工作区/pkg/youros/../yourpackage.a中就绪


7

在装有cygwin的Windows上,将GOBIN设置为$ GOPATH / bin似乎是一个好主意。

并记得正确转义Windows文件名分隔符:

$ echo $GOROOT
C:\Go\

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOPATH
C:\cygwin64\home\carl\gocode

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOBIN
C:\cygwin64\home\carl\gocode\bin

5

对于*nix系统,go执行以下命令查看安装位置:

$ which go

哪个输出让我们说:

/usr/local/go/bin/go

然后在~/.bash_profile或中添加以下条目~/.zshrc

export GOROOT=/usr/local/go
export GOPATH=$GOROOT/src //your-go-workspace
export GOBIN=$GOROOT/bin //where go-generate-executable-binaries

PATH=$PATH:$GOPATH:$GOBIN

export PATH

PS:请不要忘记按以下方式获取~/.bash_profile~/.zshrc

$ source ~/.bash_profile

4
您是否真的要将开发可执行文件放入其中/usr/local/go/bin
Dolph '18年

1

关于设置GOBIN变量版本不需要它,而仅依赖于GOPATH

  1. GOBIN如果我们没有软件包,则为必填项,即文件直接位于GOPATH目录中。当我们作为学习者尝试使用Go功能时,可能会出现这种情况

  2. 对于典型的Go项目,文件位于软件包目录下。对于这些,GOPATH已经足够了。

  3. 换句话说,以下两种解决方案都可以使用:GOBIN显式设置为$ GOPATH / bin [仅出于学习目的,可以避免] b。创建一个子目录作为包名,然后将.go文件移动到该目录中

  4. 我猜Go实用程序应该删除上述错误并更好地处理场景-基于参数是目录还是源文件



1

在Windows中:

go env -w GOBIN=C:\Users\yourname\go\bin

使用go env命令确认已设置GOBIN,然后go install正确将可执行文件正确保存在bin目录中。


1

我也遇到了同样的麻烦(无需单独设置GOBIN),请确保您具有以下内容

  1. 设置了GOPATH(这也会自动将GOBIN设置为$ GOPATH / bin)
  2. GOPATH具有以下目录bin,pkg,src
  3. custom.go放在src / <your_module>下
  4. 然后跑 go install <your_module>
  5. 您可以在bin文件夹下找到对已编译二进制文件(<your_module>)的检查

0

如果正确设置了$ GOPATH,则不需要$ GOBIN。如果是这样,只需重新检查您的项目是否位于$ GOPATH / src文件夹中即可。


0

https://golang.org/cmd/go/#hdr-Environment_variables

GOBIN'go install'将在其中安装命令的目录。

https://golang.org/cmd/go/#hdr-GOPATH_environment_variable

如果设置了GOBIN环境变量,则将命令安装到其命名的目录中,而不是DIR / bin。GOBIN必须是绝对路径。

https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more

在模块感知模式下,GOPATH不再定义在构建期间导入的含义,但仍会存储下载的依赖项(在GOPATH / pkg / mod中)和已安装的命令(在GOPATH / bin中,除非设置了GOBIN)。

因此,似乎基本上可以使用GOBIN临时或永久覆盖默认的二进制安装位置(即$GOPATH/bin)。我成功使用安装了1个文件的go“脚本” env GOBIN=$HOME/bin/ go install testfile.go。这是使用go v1.11完成的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.