Golang的相当于npm install -g

67

如果我有一个已编译的Golang程序,想要安装它以便在计算机的任何位置都可以使用bash命令运行它,我该怎么做?例如在nodejs中

npm install -g express

安装 Express 以便我可以运行命令。

express myapp

并且,Express将为名为“myapp”的节点应用程序在当前目录中生成文件目录。是否有类似于Go的等效命令?我相信现在使用“go install”命令,您必须在包含可执行文件的目录中才能运行它。

提前致谢!


你是否将GOPATH/bin添加到了PATH中?(或者你正在寻找某种Go包管理器?) - JimB
8个回答

50
更新: 如果您正在使用Go 1.16,那么本答案仍然有效,但是go install已经更改,现在是安装可执行包的推荐方法。有关解释,请参见Karim's答案:https://dev59.com/6FoV5IYBdhLWcg3wIb34#68559728 如果您当前的目录位于基于模块的项目中,或者在环境变量中设置了GO111MODULE=on,则在 Go >= 1.11 中,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


这就是我在寻找的信息,你得到了! - Yehuda Makarov
在Go 1.17中,GOPATH和GO111MODULE将被移除。您知道在这种情况下如何处理吗? - Sasha Shpota
1
Sasha,从Go 1.16开始,你可以使用go install package@version。我在下面的答案中添加了详细信息https://dev59.com/6FoV5IYBdhLWcg3wIb34#68559728。 - Karim

36

从 Go >= 1.16 开始,安装可执行文件的推荐方式是使用

go install package@version

例如,go install github.com/fatih/gomodifytags@latest

可执行文件(主包)将安装到由GOBIN环境变量命名的目录中,默认为$GOPATH/bin或者如果未设置GOPATH环境变量,则为$HOME/go/bin。 您需要将此目录添加到PATH变量以便全局运行可执行文件。在我的情况下,我已经将此行添加到了我的~/.zshrc文件中。(如果您使用的是bash,请将其添加到~/.bash_profile文件中):

export PATH="$HOME/go/bin:$PATH"

Go团队发布了一篇关于这项更改的博客文章,以下是解释引用:

我们曾经推荐使用go get -u程序来安装可执行文件,但是这种用法在添加或更改go.mod中的模块版本要求时会导致太多的混淆。

有关详细信息,请参阅go install文档


我正在使用go 1.19,我已经设置了GO111MODULE=on和GOMODCACHE到某个目录 - $HOME/go/pkg/mod。我发现go install <package>@version正在下载到GOMODCACHE目录中。这是为什么?有任何想法吗? - Rajendra Gosavi

26
据我所知,没有直接等效于npm install -g的命令。最接近的等效命令不是go install,而是go get。从帮助页面(go help get)可以看到:

用法:go get [-d] [-f] [-fix] [-insecure] [-t] [-u] [build flags] [packages]

Get 命令会下载并安装由导入路径指定的包及其依赖项。

默认情况下,go get会将二进制文件安装到$GOPATH/bin目录中,因此使这些二进制文件可在任何地方调用的最简单方法是将该目录添加到您的$PATH中。

为此,请将以下行添加到您的.bashrc(或.zshrc,具体取决于您使用的shell)中:

export PATH="$PATH:$GOPATH/bin"

另外,您也可以将可执行文件复制或链接到 /usr/local/bin

ln -s $GOPATH/bin/some-binary /usr/local/bin/some-binary

2
当时这是正确的(感谢您的帮助),但值得注意的是,对于任何遇到这个问题的人来说,现在有一个go install命令可以构建二进制文件并将其放置在您的$GOPATH/bin目录下。 - Ryan
1
我必须安装go.mod文件中列出的所有依赖项。我可以使用go get命令一个一个地安装它们,但是否有其他替代方法?类似于npm i,它可以一次性安装所需的所有依赖项。 - Om Gupta

11

Linux用户的简短解决方案:

  1. 像平常一样使用go get命令
  2. 将以下代码添加到.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
  1. 重新启动终端或source它。安装的二进制文件将在全局范围内可用。

对于 Go v1.8+

  1. go install package_name@latest

这个解决方案适用于Linux、macOS(和/或.zshrc),以及Windows上的git-bash。 - MD. Mohiuddin Ahmed

5
注意:此答案已过时,自2020年 go get弃用 后,这里提供的解决方案将无法与新版Go运行时安装一起使用。
在Go中最接近这个命令的是go get。默认情况下,它将从提供的存储库URL获取一个Go包,并要求在您的shell中设置$GOPATH变量,以便Go知道在哪里存储这些包(并随后在编译依赖于go get的包的代码时知道在哪里找到它们)。
示例语法:
$ go get github.com/user/repo

npm-g 标志提供的行为是默认的,使用 go get 安装的软件包通常是全局可用的。

有关该命令的更多信息,请参见 go get --help

如 @helmbert 所述,如果您正在安装独立软件包,则将您的 $GOPATH 添加到 $PATH 中会很有用。


当我使用这个时,go/bin 文件夹是不变的。文件还可能去其他地方吗? - kendfss
@kendfss 有点晚了(我想你现在已经找到解决方案了),但在这个答案和你的评论之间的某个时刻,Go 对如何打包进行了相当大的重构。最值得注意的是,go get自2020年起已被弃用。我已经有一段时间没有将 Go 作为主要编程语言使用了,所以除了遵循官方文档外,我无法提供更多建议。 - Jules

2
如果您正在使用zsh:
首先:使用以下命令安装您的软件包:
go install package@version

然后,你需要编辑你的.zshrc文件。
nano ~/.zshrc

在.zshrc文件的末尾添加以下行:
export PATH="$HOME/go/bin:$PATH"

最后但同样重要的是:
source ~/.zshrc

然后打开一个新的终端并执行您的命令 :)

0

TL;DR在底部。我将带您了解我是如何得出这个结论的,以及为什么更明显的解决方案不起作用。


看到这个问题,我想:“如果我可以设置root的GOPATH=/usr,它会在/usr/bin/和/usr/src中安装东西!”
所以我尝试了显而易见的事情:
  1. 在root用户的.bashrc文件中添加GOPATH=/usr
    然后它奏效了!
    有点儿。
    实际上并不是。
    原来,sudo命令并不会执行root用户的.bashrc文件。出于“安全”考虑或类似的原因。

  2. /etc/sudoers中执行env_set或其它命令
    事实证明,/etc/sudoers文件只能删除环境变量,没有env_set指令。
    (根据我的发现)

  3. 查看man sudoers文件
    sudo命令从哪里获取默认的环境变量集?
    好吧,列表中的第一个是/etc/environment,所以我使用了它。


sudo echo "GOPATH=/usr" >> /etc/environment
sudo go get <repo>

二进制文件将被放在/usr/bin目录下,源代码将被放在/usr/src目录下。
以非root用户运行go将会按照正常的方式使用GOPATH。

你也可以将 GOPATH=/,并安装在 /bin/src 中。 - SIGSTACKFAULT
通常情况下,/bin/usr/bin 目录应该只由你的发行版软件包管理器进行修改。/usr/local 目录是一个更好的放置系统级修改的位置。这样你就不会意外地影响到软件包管理器,而且权限通常更适合非特权用户进行修改(例如在 macOS 上)。 - Mr. DOS

0

如果您没有安装Go,可以使用gobinaries。它会从GitHub仓库构建项目的按需二进制文件。

安装Go包的命令如下:

curl -sf https://gobinaries.com/rakyll/hey | sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接