如果我有一个我想要安装的已编译的Golang程序,我可以从计算机上的任何位置使用bash命令运行它,我该怎么做?例如,在nodejs
中npm install -g express
安装express表示我可以运行命令
express myapp
和express将为我当前目录中的一个名为“myapp”的节点应用程序生成一个文件目录。 go有同等的命令吗?我相信现在使用“go install”命令你必须在包含可执行文件的目录中才能运行它
提前致谢!
答案 0 :(得分:9)
据我所知,没有直接等同于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
,具体取决于您使用的是哪个shell):
export PATH="$PATH:$GOPATH/bin"
或者,您也可以将可执行文件复制或链接到/usr/local/bin
:
ln -s $GOPATH/bin/some-binary /usr/local/bin/some-binary
答案 1 :(得分:5)
使用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。
答案 2 :(得分:2)
Go中最接近的类似物是go get
。默认情况下,它将从提供的存储库URL获取Go包,并且需要在shell中设置$GOPATH
变量,以便Go知道存储包的位置(以及随后在编译代码时在哪里找到它们)在go get
- ted包上。)
语法示例:
$ go get github.com/user/repo
npm
的{{1}}标志提供的行为是默认行为,使用-g
安装的软件包通常可在全球范围内使用。
有关该命令的详细信息,请参阅go get
。
如@helmbert所述,如果您要安装独立软件包,将go get --help
添加到$GOPATH
非常有用。
答案 3 :(得分:2)
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
答案 4 :(得分:0)
TL; DR 在底部。我将向您介绍如何得出这个结论,以及为什么更明显的解决方案不起作用。
看到这个问题,我想“如果我可以设置root的GOPATH=/usr
,它将在/usr/bin/
和/usr/src
中安装东西!”
所以我尝试了明显的事情:
将GOPATH=/usr
添加到根目录的.bashrc
。
奏效了!
有点
不是真的
原来,sudo
没有执行根目录的.bashrc
。出于“安全性”之类的要求。
执行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将以“正常”方式使用GOPATH。
答案 5 :(得分:0)
从 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 团队发布了关于此更改的 blog post,以下是解释引用:
<块引用>我们曾经推荐使用 go get -u program 来安装一个可执行文件,但是这种用法与 go get 在 go.mod 中添加或更改模块版本要求的含义造成了太多混淆。
答案 6 :(得分:0)
如果您还没有安装 go,您可以使用 gobinaries。它从 github 存储库构建项目的按需二进制文件。
安装go包的命令是:
curl -sf https://gobinaries.com/rakyll/hey | sh