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=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。
TL;DR 在底部。我将向您介绍我是如何得出这个结论的,以及为什么更明显的解决方案不起作用。
看到这个问题,我想到了"If I could set root's GOPATH=/usr
, it would install things in /usr/bin/
and /usr/src
!"
所以我尝试了显而易见的事情:
将 GOPATH=/usr
添加到根的 .bashrc
。
它奏效了!
有点。
不是真的。
事实证明,sudo
不会执行 root 的 .bashrc
。对于 "security" 或类似的东西。
做env_set
或/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
中。
运行 go as non-root 将使用 GOPATH "normal" 方式。
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 v1.8+
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
如果我有一个已编译的 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=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。
TL;DR 在底部。我将向您介绍我是如何得出这个结论的,以及为什么更明显的解决方案不起作用。
看到这个问题,我想到了"If I could set root's GOPATH=/usr
, it would install things in /usr/bin/
and /usr/src
!"
所以我尝试了显而易见的事情:
将
GOPATH=/usr
添加到根的.bashrc
。
它奏效了!
有点。
不是真的。
事实证明,sudo
不会执行 root 的.bashrc
。对于 "security" 或类似的东西。做
env_set
或/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
中。
运行 go as non-root 将使用 GOPATH "normal" 方式。
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 v1.8+
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