Debian的Packaging Go应用程序

时间:2013-02-27 04:13:29

标签: go debian packaging

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

我一直在寻找现有的问题;但是,我的所有研究都提出了关于包含golang开发环境的.deb文件的问题/答案(即,如果你sudo apt-get install golang-go,你会得到什么)。

5 个答案:

答案 0 :(得分:22)

好。我认为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程序的一般问题,您可能会发现以下资源非常有用:

  • This thread开始使用Go for Debian打包器之一。
  • 特别是,该帖子中的第一篇文章链接到debian-devel上的this discussion
  • The second thread关于debian-devel关于同样的问题(这是前一个线程的逻辑延续)。

2015-10-15

更新

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

从那时起包装Go应用程序和软件包的情况得到了显着改善,并且可以使用“经典”Go(所谓的gc套件来源于Google)而不是{{1}来构建Debian软件包。 }}。 并且存在良好的包装基础设施。

现在,gcc-go描述here时,将对Go程序进行debian化时使用的关键工具。

答案 1 :(得分:16)

我自己一直在调查,我基本上就在那里。

概要

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

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

     # 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'。 这是神奇的“go install”行:

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

    • 同时更新版权文件,自述文件,许可证等
  3. 将您的源码放在src文件夹中。 e.g。

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

    或例如.2

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

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

    这应该为您的架构生成二进制.deb文件,加上'source deb'(。tgz)和源deb描述文件(.dsc)。

  5. 更多详情

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

    你会在Ubuntu的Launchpad资源库中找到一些基于Go的软件包。到目前为止,我已经找到cobzr(bzr的git-style分支)和juju-core(一个devops项目,从Python移植)。

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

    最后

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

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

答案 2 :(得分:5)

使用fpm,从Go Applications构建deb或rpm包也很容易。

从rubygems中获取它:

gem install fpm

构建二进制文件后,例如foob​​ar,你可以像这样打包:

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

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

答案 3 :(得分:2)

有一份正式的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:行中指定依赖项(请参阅上面有关打包依赖项的内容)。

答案 4 :(得分:-2)

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