Golang 相当于 npm install -g

Golang equivalent of npm install -g

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

npm install -g express

安装 express 这样我就可以 运行 命令

express myapp

and express 将在我的当前目录中为名为 "myapp" 的节点应用程序生成一个文件目录。是否有等效的命令?我相信现在使用 "go install" 命令你必须在包含可执行文件的目录中才能 运行 it

提前致谢!

Go 中与此最接近的类似物是 go get。默认情况下,它将从提供的存储库 URL 中获取 Go 包,并需要在 shell 中设置一个 $GOPATH 变量,以便 Go 知道将包存储在哪里(以及随后根据 go get-ted 包编译代码时在哪里可以找到它们。

示例语法:

$ go get github.com/user/repo

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

有关命令的详细信息,请参阅 go get --help

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

据我所知,没有直接等同于 npm install -g。最接近的等价物不是 go install,而是 go get。从帮助页面 (go help get):

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

Get downloads and installs the packages named by the import paths, along with their dependencies.

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

为此,将以下行放入您的 .bashrc(或 .zshrc,具体取决于您使用的 shell):

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

或者,您也可以将可执行文件复制或link到/usr/local/bin:

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

更新:如果您使用的是 Go 1.16,此答案仍然有效,但 go install 已更改,现在是安装可执行程序包的推荐方法。请参阅 Karim 的回答以获取解释:

使用 Go >= 1.11,如果您的当前目录位于基于模块的项目中,或者您已在您的环境中设置 GO111MODULE=ongo 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

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


看到这个问题,我想到了"If I could set root's GOPATH=/usr, it would install things in /usr/bin/ and /usr/src!"

所以我尝试了显而易见的事情:

  1. GOPATH=/usr 添加到根的 .bashrc
    它奏效了!
    有点。
    不是真的。
    事实证明,sudo 不会执行 root 的 .bashrc。对于 "security" 或类似的东西。

  2. env_set/etc/sudoers
    中的某事 原来,/etc/sudoers只能移除个环境变量。没有 env_set 指令。
    (据我所知)

  3. 挖掘 man sudoers.
    sudo 从哪里获得它的默认环境变量集?
    好吧,列表中的第一个是/etc/environment,所以这是我使用的


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

二进制文件将放在 /usr/bin 中,源代码将放在 /usr/src 中。

运行 go as non-root 将使用 GOPATH "normal" 方式。

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. 重新启动终端或获取它。安装的二进制文件将在全球范围内可用。

Go v1.8+

  1. go install package_name@latest

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

go install package@version

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

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

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

Go 团队发布了关于此更改的 blog post,这里引用解释:

We used to recommend go get -u program to install an executable, but this use caused too much confusion with the meaning of go get for adding or changing module version requirements in go.mod.

参考go install documentation了解更多详情

如果你没有安装go,你可以使用gobinaries。它从 github 存储库构建项目的按需二进制文件。

安装 go 包的命令是:

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