打包去Debian的应用程序

我怎样才能把我的Go二进制文件放到Debian软件包中? 由于Go是静态链接的,我只有一个可执行文件 – 我不需要太多复杂的项目元数据信息。 有没有一个简单的方法来打包可执行文件和资源文件,而不会经历debuild的创伤?

我已经看了很多现存的问题。 然而,我所有的研究都是关于一个包含golang开发环境的.deb文件的问题/答案(即,如果你使用sudo apt-get install golang-go ,你会得到什么)。

好。 我觉得debuild的唯一“创伤”是debuild后运行lintian ,而lintian则试图发现你的软件包有问题。

所以有两种方法来对付这种情况:

  • 不要使用debuild :这个工具只是调用dpkg-buildpackage ,它确实需要举重。 构build二进制包的通常调用是dpkg-buildpackage -us -uc -b 。 你仍然可以将debuild其他用途,例如debuild clean
  • 添加所谓的“lintian覆盖” ,可以用来使lintianselect的问题视而不见,你坚持认为,这不是问题。

这两种方法都意味着你不要试图用打包工具来构build你的应用程序,而是把它当作一个只包装到一个包中的blob。 这将需要从正常的方式debianining debian/rules工作(不要试图build立任何东西)。

另一个可能的解决scheme是,尝试使用gcc-go (加上gold进行链接):因为它是GCC前端,所以这个工具产生一个dynamic链接的应用程序(链接反对libgo或类似的东西)。 我个人还没有这方面的经验,只有在你打算把你的软件包推入Debian的时候才会考虑使用它。

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

  • 这个线程是由Deb的一个开发人员开始的。
  • 特别是该主题中的第一篇文章链接到了关于debian-devel的讨论 。
  • 关于这个问题的debian-devel 的第二个线程 (这是前线程的逻辑延续)。

2015-10-15 更新

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

从那时起,包装Go应用和软件包的情况得到了显着改善,使用“经典”Go(所谓的gc suite from Google)而不是gcc-go来构buildDebian软件包成为可能。 而且还有一个良好的包装基础设施。

现在debian化Go程序时使用的关键工具是这里描述的dh-golang

我刚刚一直在看这个,我基本上在那里。

概要

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

  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 /控制文件(名称,版本,来源)。 您可能需要将golang-stable依赖项更改为golang-go。
    • debian / control文件是清单。 注意“构build依赖”( Build-Depends: debhelper (>= 7.0.50~), golang-stable )和3种体系结构。 使用Ubuntu(没有gphers ppa),我必须改变golang稳定golang去。
    • 编辑debian / rules文件(把你的包名称代替cobzr)。
    • debian / rules文件基本上是一个'make'文件,它显示了如何构build包。 在这种情况下,他们严重依赖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. build立包

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

    这应该为你的体系结构产生一个二进制的.deb文件,加上'source deb'(.tgz)和源代码描述文件(.dsc)。

更多细节

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

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

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

最后

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

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

使用fpm构build来自Go Applications的deb或rpm包也非常容易。

从rubygems中获取:

 gem install fpm 

在构build你的二进制文件之后,比如foobar,你可以像这样打包:

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

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

有一个正式的Debian政策文件描述了Go的打包程序: http : //pkg-go.alioth.debian.org/packaging.html

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

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

对于可执行文件 :使用dh-golang创build软件包。 在Build-Depends:行中指定依赖关系(参见上面有关打包依赖关系的内容)。

我最近发现https://packager.io/ – 我很满意他们在做什么。 也许打开一个包,看看他们在做什么?