如果我有一个已编译的Golang程序,想要安装它以便在计算机的任何位置都可以使用bash命令运行它,我该怎么做?例如在nodejs中
npm install -g express
安装 Express 以便我可以运行命令。
express myapp
并且,Express将为名为“myapp”的节点应用程序在当前目录中生成文件目录。是否有类似于Go的等效命令?我相信现在使用“go install”命令,您必须在包含可执行文件的目录中才能运行它。
提前致谢!
如果我有一个已编译的Golang程序,想要安装它以便在计算机的任何位置都可以使用bash命令运行它,我该怎么做?例如在nodejs中
npm install -g express
安装 Express 以便我可以运行命令。
express myapp
并且,Express将为名为“myapp”的节点应用程序在当前目录中生成文件目录。是否有类似于Go的等效命令?我相信现在使用“go install”命令,您必须在包含可执行文件的目录中才能运行它。
提前致谢!
go install
已经更改,现在是安装可执行包的推荐方法。有关解释,请参见Karim's答案:https://dev59.com/6FoV5IYBdhLWcg3wIb34#68559728
如果您当前的目录位于基于模块的项目中,或者在环境变量中设置了GO111MODULE=on
,则在 Go >= 1.11 中,go get
将不会“全局”安装包。它将把它们添加到您项目的go.mod文件中。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。
go install package@version
。我在下面的答案中添加了详细信息https://dev59.com/6FoV5IYBdhLWcg3wIb34#68559728。 - Karim从 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
文档
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
go install
命令可以构建二进制文件并将其放置在您的$GOPATH/bin
目录下。 - RyanLinux用户的简短解决方案:
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 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 get
自2020年起已被弃用。我已经有一段时间没有将 Go 作为主要编程语言使用了,所以除了遵循官方文档外,我无法提供更多建议。 - Julesgo install package@version
nano ~/.zshrc
export PATH="$HOME/go/bin:$PATH"
source ~/.zshrc
TL;DR在底部。我将带您了解我是如何得出这个结论的,以及为什么更明显的解决方案不起作用。
在root用户的.bashrc文件中添加GOPATH=/usr
然后它奏效了!
有点儿。
实际上并不是。
原来,sudo命令并不会执行root用户的.bashrc文件。出于“安全”考虑或类似的原因。
在/etc/sudoers中执行env_set
或其它命令
事实证明,/etc/sudoers文件只能删除环境变量,没有env_set
指令。
(根据我的发现)
查看man sudoers
文件
sudo命令从哪里获取默认的环境变量集?
好吧,列表中的第一个是/etc/environment
,所以我使用了它。
sudo echo "GOPATH=/usr" >> /etc/environment
sudo go get <repo>
/usr/bin
目录下,源代码将被放在/usr/src
目录下。GOPATH=/
,并安装在 /bin
和 /src
中。 - SIGSTACKFAULT/bin
和 /usr/bin
目录应该只由你的发行版软件包管理器进行修改。/usr/local
目录是一个更好的放置系统级修改的位置。这样你就不会意外地影响到软件包管理器,而且权限通常更适合非特权用户进行修改(例如在 macOS 上)。 - Mr. DOS如果您没有安装Go,可以使用gobinaries。它会从GitHub仓库构建项目的按需二进制文件。
安装Go包的命令如下:
curl -sf https://gobinaries.com/rakyll/hey | sh