在 Go 编程中使用 golang-Debian 包

Make use of golang- Debian packages in Go programming

要理解这个 Go 问题需要先了解一下 Debian 打包 Go 模块的要点。基本上,Go module Debian packages 是这样设计的,它们只能被 Debian packages 自己使用,而不能用于我们日常的 Go import

但是,因为它们只是我的 OS 文件系统中的文件,所以我们肯定有办法在日常 Go import 中使用 Debian 软件包。以前有人成功过吗?

我问的原因是,有很多 github 存储库包含巨大的模块,但我想要的只是其中的 tiny/small 部分,而那部分恰好已经打包为 Debian 软件包。也就是说,使用 go get 会得到我通常不需要的庞大代码库,而 apt get 可以得到我需要的东西,如果我可以利用它的话。

AFAIK,你需要 append /usr/share/gocode 到你的 GOPATH 环境变量(在你自己的私人 Go 工作区之后,由 : 分隔) 使这些包可用于 go 工具链。

请参考 this guide(并查看任何已安装的感兴趣的 Go 库包的 dpkg -L 输出——您会看到包的导入路径实际上位于 /usr/share/gocode/src 下).


(扩展@Flimzy 在他们对原始 post 的评论中提出的建议,@JimB 在他们的评论中进行了扩展……)

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

"problem" 是 Debian 和 Go 管理依赖关系的方法存在一些不一致:

  • Go 社区建议的常见做法是修复特定版本的依赖项(这些天 - 通过 go modules)并让工具链为您获取并安装它们,或者vendor 你的依赖项——这在逻辑上是相同的,但在这种情况下,你实际上将这些依赖项作为代码库的一部分(它们只是位于特定目录中)。

    前者建议用于库代码和通常可供第三方重用的代码,而后者通常由 "final" 产品(通常是内部开发)使用。

  • Debian 采用的方法是 集成: 他们可以理解地拒绝不受控制地嵌入依赖项的想法,并尝试确保一切 "reverse-dependent" 任何其他东西都被正确打包,理想情况下,任何特定的 OS 版本中只存在给定库的单个版本(尽管在现实生活中这并不总是可能的)。

这两种方法最终都不是 "correct",因为它们适用于不同的用例。

需要考虑的一件重要事情是,大多数(如果不是全部)用 Go 编写行业代码的团队将底层 OS 视为无聊的实现细节——比如,blob 的 "something" 并不太有趣,只需要 运行 目标产品(如今,通过使用容器将这种方法发挥到极致)并自行管理它们的依赖关系.
这是为什么?
这是一个哲学问题。我认为这主要归结为企业中普遍缺乏与目标平台进行适当集成的适当技能人员,同时 - 易于维护您自己的依赖项的久经考验的版本,而不是那些提供的依赖项通过发行版。

现在让我们从另一个角度看看 Debian 打包的 Go 库。
Debian 打包器通过包装 Go 库包来解决他们以集成为中心的任务,使它们对 Debian 的 build helpers 可用(参见 dh-golang)。也就是说,在 Debian 中,当您准备一些用 Go 编写的程序的包时,您将不可避免地使用 dh-golang 确保 Go 工具链以可以利用已安装包的方式被调用的东西。

现在考虑相当大比例的 Go 库代码,并且许多 运行nable 程序与平台无关, 如果您编写 Go 代码是为了通用,因此将在某个地方发布(比如在一些流行的 Git 托管解决方案上),最好以任何开发人员都可以抓住它并能够的方式组织代码无需任何特殊准备即可完成。

所以,我要引导您的是,除非您编写的代码肯定只会在 Debian 中使用,否则您的方法可能是正确的,但如果你正在编写 "regular" Go 代码,我建议将 "writing+maintaining code" 和 "Debian integration" 任务分开——也就是说,按照 Go 社区推荐的方式编写你的代码,然后编写 Debian 包,它使用已安装的依赖项。
请注意,对于后者,您可能首先需要实际打包所有缺少的依赖项。