在Go编程中使用golang-Debian包

在Go编程中使用golang-Debian包,go,module,package,debian,Go,Module,Package,Debian,要理解这个围棋问题,首先需要了解围棋模块Debian打包的要点。基本上,Go模块Debian软件包的设计使得它们只能由Debian软件包自己使用,而不能用于我们日常的Goimport 然而,因为它们只是我的操作系统文件系统中的文件,所以在日常的Goimport中肯定有一些方法可以利用Debian软件包。以前有人成功地做到过吗 我提出这个问题的原因是,有很多github Repo都包含巨大的模块,但我想要的只是其中的一小部分,而这部分恰好已经打包为Debian包。也就是说,使用go-get将为我提

要理解这个围棋问题,首先需要了解围棋模块Debian打包的要点。基本上,Go模块Debian软件包的设计使得它们只能由Debian软件包自己使用,而不能用于我们日常的Go
import

然而,因为它们只是我的操作系统文件系统中的文件,所以在日常的Go
import
中肯定有一些方法可以利用Debian软件包。以前有人成功地做到过吗


我提出这个问题的原因是,有很多github Repo都包含巨大的模块,但我想要的只是其中的一小部分,而这部分恰好已经打包为Debian包。也就是说,使用
go-get
将为我提供大量我基本不需要的代码库,而
apt-get
可以为我提供我所需要的,如果我能利用它的话

AFAIK,您需要将
/usr/share/gocode
附加到您的
GOPATH
环境变量中(在您自己的私人Go工作区之后,用
分隔),以使这些包可用于
Go
工具链

请参阅(并查看任何已安装的感兴趣的Go library软件包的
dpkg-L
输出-您会看到该软件包的导入路径实际位于
/usr/share/gocode/src
下)


(进一步说明@Flimzy在对原始帖子的评论中提出的建议,@JimB在他们的评论中提出的建议…)

您可能需要清楚地说明自己在开发时的意图

“问题”在于,Debian和Go-take管理依赖关系的方法存在某些不一致之处:

  • Go社区建议的常见做法是要么修复依赖项的特定版本(现在-通过),让工具链为您获取并安装它们,要么提供您的依赖项,这在逻辑上是相同的,但在这种情况下,您实际上将这些依赖项作为代码库的一部分(它们只是放在一个特定的目录中)

    前者建议用于库代码,通常用于第三方重用的代码,而后者通常用于“最终”产品(通常由内部开发)

  • Debian采用的方法是集成:他们拒绝不受控制地嵌入依赖项的想法,并试图确保所有被其他任何东西“反向依赖”的东西都被正确打包,理想情况下,任何特定的操作系统版本中都只存在给定库的单一版本,这是可以理解的(但在现实生活中,这并不总是可能的)

这两种方法最终都不是“正确的”,因为它们满足不同的用例

一个重要的事情是,大多数(如果不是全部的)团队写工业代码时,去把底层操作系统当作一个无聊的实现细节——比如说,一个“不太有趣”的东西,只需要运行目标产品(现在,这种方法通过使用容器达到极端)。并自行管理其依赖关系。
为什么会这样?
这是一个哲学问题。我认为这主要归结为企业中普遍缺乏适当技能的人员来与目标平台进行适当的集成,同时——维护您自己的依赖关系的经过测试的版本,而不是发行版提供的版本的难易性

现在让我们从另一个角度来看Debian打包的Go库。
Debian软件包商通过包装Go library软件包来解决其以集成为中心的任务,从而使Debian的构建助手可以使用这些软件包(请参阅)也就是说,在Debian中,当你准备一个用Go编写的程序包时,你不可避免地会使用
dh golang
这个东西,确保Go工具链的调用方式能够利用已安装的包

现在考虑GO库代码中相当大的一部分,许多可运行程序是平台无关的,如果你写的GO代码是通用的,并且将在某处发布(比如在一些流行的GIT托管解决方案上)。,以一种任何开发人员都能掌握的方式组织代码,并且能够在没有任何特殊准备的情况下进行工作,这样做会更好

因此,我要告诉您的是,除非您编写的代码肯定只在Debian中使用,否则您的方法可能是正确的,但如果您编写的是“常规”Go代码,我建议将“编写并维护代码”和“Debian集成”分开任务——也就是说,按照Go社区建议的方式编写代码,然后编写Debian包,利用已安装的依赖项。

请注意,对于后者,您可能首先需要实际打包所有缺少的依赖项。

“有许多github Repo包含巨大的模块,但我想要的只是其中的一小部分,而这部分恰好已经打包为Debian包。”需要详细说明吗?请不要做你正在尝试的事情。你最终会得到过时的版本。如果你说的是准确的,你很可能会得到部分版本。不要与工具抗争。磁盘很便宜。除非debian软件包完成Go“模块”进入缓存或通过代理,您只是获得一些go工具链未知版本的文件。您不能使用带有随机本地文件的模块。如果文件围绕其导入正确结构化,您可以继续使用gopath,这似乎不太可能,因为无需仅分发部分Package的go源代码ges.太好了!谢谢!最重要的是,谢谢你没有狭隘和主观判断!@xpt,因为我在我的$dayjob中编程Go,我确实与那些参与c