40

如何将我的 Go 二进制文件放入 Debian 包中?由于 Go 是静态链接的,我只有一个可执行文件——我不需要很多复杂的项目元数据信息。有没有一种简单的方法来打包可执行文件和资源文件而不会经历 的创伤debuild

我已经到处寻找现有的问题;然而,我所有的研究都提出了关于包含 golang 开发环境的 .deb 文件的问题/答案(即,如果你这样做,你会得到什么sudo apt-get install golang-go)。

4

5 回答 5

24

好。我认为唯一的“创伤”debuild是它lintian在构建包之后运行,并且是lintian谁试图发现你的包的问题。

因此,有两种方法可以对抗这种情况:

  • 请勿使用debuild:此工具仅调用dpkg-buildpackage真正进行必要的举重。构建二进制包的通常调用是dpkg-buildpackage -us -uc -b. 您仍然可能会debuild出于其他目的而调用,debuild clean例如。
  • 添加所谓的“lintian override”,它可以用来对你的包的选定lintian问题视而不见,你坚持认为这不是问题。

这两种方法都意味着您不要尝试通过打包工具来构建应用程序,而是将其视为刚刚包装到包中的 blob。这将需要稍微避免正常的debian/rules工作方式(不尝试构建任何东西)。

另一种可能的解决方案(实际上更像是 Debian-ish)是尝试使用gcc-go(加上gold链接):因为它是 GCC 前端,所以这个工具产生一个动态链接的应用程序(链接到libgo或类似的东西这)。我个人还没有使用它的经验,并且只有在您打算尝试将您的软件包推送到 Debian 中时才会考虑使用它。

关于为 Debian 打包 Go 程序的一般问题,您可能会发现以下资源很有用:


2015 年 10 月 15 日更新

(由于这篇文章似乎仍在被人们搜索、发现和研究,我决定更新它以更好地反映当前的事态。)

从那时起,打包 Go 应用程序和软件包的情况得到了显着改善,并且可以使用“经典”Go(所谓的gc套件源自 Google)而不是gcc-go. 并且还有一个很好的包基础设施。

现在dh-golang描述了在对 Go 程序进行 debian 时使用的关键工具。

于 2013-02-27T07:50:34.620 回答
16

我自己一直在研究这个,我基本上就在那里。

概要

通过从 Canonical 现有 Go 项目之一的“包”分支中“借用”,您可以使用 dpkg-buildpackage 构建您的包。

  1. 安装依赖项并从另一个仓库中获取“包”分支。

     # I think this list of packages is enough. May need dpkg-dev aswell.
     sudo apt-get install bzr debhelper build-essential golang-go
     bzr branch lp:~niemeyer/cobzr/package mypackage-build
     cd mypackage-build
    
  2. 编辑元数据。

    • 编辑 debian/control 文件(名称、版本、源代码)。您可能需要将 golang-stable 依赖项更改为 golang-go。
    • debian/control文件是清单。请注意“构建依赖项”( Build-Depends: debhelper (>= 7.0.50~), golang-stable) 和 3 种架构。使用 Ubuntu(没有 gophers ppa),我不得不将 golang-stable 更改为 golang-go。
    • 编辑 debian/rules 文件(用你的包名代替 cobzr)。
    • debian/rules文件基本上是一个“make”文件,它显示了包是如何构建的。在这种情况下,他们严重依赖 debhelper。他们在这里设置了 GOPATH,并调用了“go install”。这是神奇的“安装”行:

    cd $(GOPATH)/src && find * -name '*.go' -exec dirname {} \; | xargs -n1 go install

    • 还要更新版权文件、自述文件、许可证等。
  3. 将您的源代码放在 src 文件夹中。例如

     git clone https://github.com/yourgithubusername/yourpackagename src/github.com/yourgithubusername/yourpackagename
    

    或 eg2

     cp .../yourpackage/ src/
    
  4. 构建包

     # -us -uc skips package signing.
     dpkg-buildpackage -us -uc
    

    这应该为您的体系结构生成一个二进制 .deb 文件,以及“源 deb”(.tgz)和源 deb 描述文件(.dsc)。

更多细节

所以,我意识到 Canonical(Ubuntu 人)正在使用 Go,并为他们的一些 Go 项目构建 .deb 包。Ubuntu 基于 Debian,因此在大多数情况下,相同的方法应该适用于两个发行版(依赖项名称可能略有不同)。

您会在 Ubuntu 的 Launchpad 存储库中找到一些基于 Go 的软件包。到目前为止,我已经找到了 cobzr(bzr 的 git 风格分支)和juju-core(一个 devops 项目,从 Python 移植而来)。

这两个项目都有一个“主干”和一个“包”分支,您可以看到debian/包分支内的文件夹。这里最重要的 2 个文件是debian/controldebian/rules - 我已链接到“浏览源”。

最后

我没有涉及的是交叉编译你的包(到 3、386/arm/amd64 的其他 2 个架构)。交叉编译在 go 中并不太棘手(您需要为每个目标平台构建工具链,然后在“go build”期间设置一些 ENV 变量),我自己一直在研究交叉编译器实用程序。最终,我希望将 .deb 支持添加到我的实用程序中,但首先我需要明确这项任务。

祝你好运。如果您取得任何进展,请更新我的答案或添加评论。谢谢

于 2013-02-28T10:19:02.213 回答
6

使用 fpm 从 Go 应用程序构建 deb 或 rpm 包也非常容易。

从 ruby​​gems 中获取:

gem install fpm

在构建你的二进制文件后,例如 foobar,你可以像这样打包它:

fpm -s dir -t deb -n foobar -v 0.0.1 foobar=/usr/bin/

fpm 支持各种高级封装选项。

于 2015-02-09T09:03:13.697 回答
3

有一个官方的 Debian 政策文件描述了 Go 的打包过程:https ://go-team.pages.debian.net/packaging.html

对于:使用dh-make-golang创建包骨架。使用从导入路径派生的名称命名您的包,并带有-dev后缀,例如 golang-github-lib-pq-dev。在线指定依赖项Depends:。(这些是构建的源依赖,而不是运行的二进制依赖,因为 Go 静态链接所有源。)

安装库包会将其源代码安装到/usr/share/golang/src(可能编译后的库可以进入.../pkg)。构建依赖的 Go 包将使用来自这些系统范围位置的工件。

对于可执行文件:使用dh-golang创建包。在行中指定依赖Build-Depends:项(有关打包依赖项的信息,请参见上文)。

于 2016-05-12T23:12:02.303 回答
-2

我最近发现了https://packager.io/ - 我对他们正在做的事情感到非常满意。也许打开其中一个包看看他们在做什么?

于 2015-09-09T15:42:33.690 回答