在Debian上使用非默认golang软件包安装的Go


2

我正在尝试安装go 1.8。

除golang-1.7之外的任何东西的apt软件包均不起作用。Golang-1.7可以正确安装,而golang-1.8则不能。回购中的包装是否错误/不完整?

Debian声称使用golang-1.8:“此软件包是一个元软件包,安装后将保证已安装(大部分)完整的Go开发环境。” https://packages.debian.org/stretch/golang-1.8 但这显然不是事实。

# apt install golang-1.8 golang-1.8-go
Reading package lists... Done
Building dependency tree
Reading state information... Done
golang-1.8 is already the newest version (1.8.1-1).
golang-1.8-go is already the newest version (1.8.1-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
# go
bash: /usr/bin/go: No such file or directory
# whereis go
go:
# uname -a
Linux linux 4.9.0-6-amd64 #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02) x86_64 GNU/Linux
# cat /etc/debian_version 
9.4

Answers:


3

背景

“保证已安装……”仅意味着它取决于实际提供Go开发人员的一组软件包。ENV。

正如你可以看到,这个软件包依赖于其他三个包- ,,golang-1.8-doc -所以,当你安装,这三个将被安装为好。golang-1.8-gogolang-1.8-srcgolang-1.8

我必须承认,您遇到的问题确实令人困惑,但可以轻松解释。

如果查看由安装的软件包列表golang-1.8-go,您会看到该go工具安装为/usr/lib/go-1.8/bin/go,并且/usr/lib/go-1.8/bin默认PATH环境变量(由设置/etc/profile)中未列出目录。

这样做的原因有两个:

  • golang-X.Y*同一时间在同一Debian套件中可以有几组软件包。例如,Stretch有1.7和1.8。

    至关重要的是要了解它们是可共安装的,这对于测试要针对其进行测试的项目如何与X.Y工作很有用X.Y+N

  • Debian提供了一个特殊的“最通用” Go软件包,该软件包取决于特定的golang-X.Y软件包,该软件包被视为特定的Debian版本的“标准”。

    golang-go如您所见,在Stretch中,它的版本为“ 1.7”并取决于 golang-1.7-go

    该程序包确保特定默认golang-X.Y-go程序包提供的可执行二进制文件可在“标准位置”中找到/usr/bin请参阅)。

怎么办呢?

几种可能性:

  • /usr/lib/go-1.8/bin/go通过其完整路径名进行调用。

    go工具“知道”它的GOROOT位置,因此可以找到特定于其版本的软件包。

  • 在该目录前添加路径变量;说说像

     export PATH="/usr/lib/go-1.8/bin:$PATH"
    

    进入您的~/.bashrc脚本,下一个调用go将在新位置找到它。

  • 抓住golang-go软件包的源代码,对其进行修复,以使其成为golang-1.8-go默认软件包,然后构建并安装。

    (我不建议您现在就这样走。)

希望这可以帮助。


另一种解释

Stretch有两包,每包三包:golang-1.7-*golang-1.8-*

在每个软件包中,golang-1.N-go软件包都将其go二进制文件安装在下/usr/lib/go-1.N/bin他们都没有在下安装符号链接/usr/bin

这样做的原因是使这些程序包可同时安装, 以便您可以使用任何已安装的版本来编译Go代码。

现在有另一个独立的程序包,该程序包不使用名称对Go发行版进行编码。它名为golang-go,并且仅取决于Stretch的Go运行时的默认版本在golang-1.7-go 哪里。1.7

在另一个版本中,golang-go将依赖于另一个golang-X.Y-go 软件包。

正是这个包,它提供/usr/bin/go在指向 /usr/lib/go-1.7/bin/go

因此,如果(且仅当)已golang-go安装,您将go在下获得可用的二进制文件/usr/bin,并且该文件将为Stretch中的Go 1.7。

不,不可能以某种方式强制从已安装的软件包中golang-go指向 ,也没有办法通过“ dpkg替代品”机制选择首选的Go版本。gogolang-1.8-go

我对这种方法的“为什么”的看法是go在任何给定的Debian 版本中都有一个众所周知的版本。据说这是构建用Go语言编写的Debian软件包所必需的。否则,包装制造机械需要发明一些技巧来查找默认的Go版本。截至目前,他们的源程序包可能只依赖于golang-go某天而已。


感谢您的回复。我现在知道如何访问该程序,但是对于为什么会发生这种情况我仍然感到困惑,我从未遇到过这种情况。是的,golang-1.8会安装您提到的所有dep,但是至少不应该是使用/ usr / bin / go-> /usr/lib/go-1.8/bin/go创建的符号链接?
user6329530

1
我已经解释了这一点。据说我未能正确地做到这一点。让我们再刺一击。更新了我的答案。
kostix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.