如果我有一个编译好的 Golang 程序,我想安装它以便我可以在我的计算机上的任何地方使用 bash 命令运行它,我会怎么做?例如,在 nodejs
npm install -g express
安装 express 以便我可以运行命令
express myapp
express 会在我当前的目录中为一个名为“myapp”的节点应用程序生成一个文件目录。是否有等效的命令?我相信现在使用“go install”命令,您必须在包含可执行文件的目录中才能运行它
提前致谢!
如果我有一个编译好的 Golang 程序,我想安装它以便我可以在我的计算机上的任何地方使用 bash 命令运行它,我会怎么做?例如,在 nodejs
npm install -g express
安装 express 以便我可以运行命令
express myapp
express 会在我当前的目录中为一个名为“myapp”的节点应用程序生成一个文件目录。是否有等效的命令?我相信现在使用“go install”命令,您必须在包含可执行文件的目录中才能运行它
提前致谢!
更新:如果您使用的是 Go 1.16,此答案仍然有效,但go install
已更改,现在是安装可执行包的推荐方法。有关解释,请参阅 Karim 的答案:https ://stackoverflow.com/a/68559728/10490740
使用 Go >= 1.11,如果您的当前目录位于基于模块的项目中,或者您已GO111MODULE=on
在环境中设置,go get
则不会“全局”安装包。它会将它们添加到您项目的 go.mod 文件中。
从 Go 1.11.1 开始,设置GO111MODULE=off
可以规避这种行为:
GO111MODULE=off go get github.com/usr/repo
基本上,通过禁用此单个命令的模块功能,它将按预期安装到 GOPATH。
不使用模块的项目仍然可以go get
正常将二进制文件安装到$GOPATH/bin
.
关于这种行为分支的变化,有一个冗长的对话和多个记录的问题:golang/go - cmd/go: go get should not add a dependency to go.mod #27643。
据我所知,没有直接等价于npm install -g
. 最接近的等价物不是go install
,而是go get
。从帮助页面 ( go help get
):
用法:
go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]
下载并安装由导入路径命名的包及其依赖项。
默认情况下,go get
将二进制文件安装到$GOPATH/bin
,因此使这些二进制文件可从任何地方调用的最简单方法是将该目录添加到您的$PATH
.
为此,将以下行放入您的.bashrc
(或.zshrc
,取决于您使用的外壳):
export PATH="$PATH:$GOPATH/bin"
或者,您也可以将可执行文件复制或链接到/usr/local/bin
:
ln -s $GOPATH/bin/some-binary /usr/local/bin/some-binary
从 Go >= 1.16开始,推荐的安装可执行文件的方法是使用
go install package@version
例如,go install github.com/fatih/gomodifytags@latest
。
可执行文件(主包)安装到由GOBIN
环境变量命名的目录中,默认为$GOPATH/bin
或$HOME/go/bin
如果GOPATH
未设置环境变量。您需要将此目录添加到PATH
变量中以全局运行可执行文件。就我而言,我已将此行添加到我的~/.zshrc
文件中。(如果您使用的是 bash,请将其添加到~/.bash_profile
文件中):
export PATH="$HOME/go/bin:$PATH"
Go 团队发布了一篇关于此更改的博客文章,以下是解释引述:
我们曾经推荐使用 go get -u 程序来安装一个可执行文件,但这种使用导致与 go get 在 go.mod 中添加或更改模块版本要求的含义混淆太多。
有关详细信息,请参阅go install
文档
Go 中与此最接近的类似物是go get
. 默认情况下,它将从提供的存储库 URL 获取 Go 包,并需要$GOPATH
在您的 shell 中设置一个变量,以便 Go 知道在哪里存储包(以及随后在编译代码时根据go get
-ted 包在哪里找到它们) .
示例语法:
$ go get github.com/user/repo
npm
的标志提供的行为-g
是默认的,使用安装的包go get
通常全局可用。
有关该命令的更多信息,请参阅go get --help
。
正如@helmbert 所提到的,如果您要安装独立软件包,将您的添加$GOPATH
到您的$PATH
会很有用。
Linux用户的简短解决方案:
go get
像往常一样使用命令.bashrc
:# This is the default GOPATH, you should confirm with the 'go env' command
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
如果你没有安装 go,你可以使用gobinaries。它从 github repo 构建项目的按需二进制文件。
安装 go 包的命令是:
curl -sf https://gobinaries.com/rakyll/hey | sh
TL;底部的 DR。我将向您介绍我是如何得出这个结论的,以及为什么更明显的解决方案不起作用。
看到这个问题,我想“如果我可以设置 root's ,它会在andGOPATH=/usr
中安装东西!”/usr/bin/
/usr/src
所以我尝试了显而易见的事情:
添加GOPATH=/usr
到根目录.bashrc
。
它奏效了!
有点。
并不真地。
事实证明,sudo
不执行 root 的.bashrc
. 为了“安全”或类似的东西。
Do env_set
or something in/etc/sudoers
原来,/etc/sudoers
只能删除环境变量。没有env_set
指令。
(据我所知)
挖掘man sudoers
。
sudo 从哪里获得它的默认环境变量集?
好吧,列表中的第一个是/etc/environment
,所以这是我使用的那个。
sudo echo "GOPATH=/usr" >> /etc/environment
sudo go get <repo>
二进制文件将被放入/usr/bin
,源代码将被放入/usr/src
。
以非 root 身份运行 go 将以“正常”方式使用 GOPATH。