Debian的Packaging Go应用程序

web*_*rc2 37 debian packaging go

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

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

kos*_*tix 22

好.我认为唯一的"创伤" debuild是它lintian在构建软件包后运行,并且它lintian试图发现软件包的问题.

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

  • 不要使用debuild:这个工具只是调用dpkg-buildpackage真正做必要的举重.通常建立二进制包的调用是dpkg-buildpackage -us -uc -b.你仍然可能会呼吁debuild其他目的,debuild clean例如.
  • 添加所谓的"lintian覆盖",可用于对您选择的包装问题lintian视而不见,您坚持认为,这不是问题.

这两种方法都意味着您不会尝试通过打包工具构建应用程序,而是将其视为仅包装到包中的blob.这将需要从正常的debian/rules工作方式略微抽象(不试图建立任何东西).

另一种可能的解决方案(实际上更像Debian-ish)是尝试使用gcc-go(加上gold链接):因为它是一个GCC前端,这个工具产生一个动态链接的应用程序(链接libgo或类似的东西)这个).我个人来说,它还没有使用它的经验,如果你打算尝试将你的软件包推入适当的Debian,我会考虑使用它.

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

  • 这个帖子是由Go for Debian打包者之一开始疯狂的.
  • 特别是,该线程中的第一篇文章链接到关于debian-devel的讨论.
  • debian-devel关于同一个问题的第二个线程(它是前一个线程的逻辑延续).

2015-10-15 更新.

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

从那时起,包装Go应用程序和软件包的情况得到了显着改善,并且可以使用"经典"Go(所谓的gc来自Google的套件)而不是使用gcc-go.来构建Debian软件包.并且存在良好的包装基础设施.

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


lah*_*her 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑元数据.

    • 编辑debian/control文件(名称,版本,源代码).您可能需要将golang-stable依赖项更改为golang-go.
    • 是Debian /控制文件清单.请注意'构建依赖关系'(Build-Depends: debhelper (>= 7.0.50~), golang-stable)和3架构.使用Ubuntu(没有gophers ppa),我不得不将golang-stable改为golang-go.
    • 编辑debian/rules文件(将您的包名称替换为cobzr).
    • 是Debian /规则文件基本上是一个"制作"文件,它显示了包如何被建立.在这种情况下,他们严重依赖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
    
    Run Code Online (Sandbox Code Playgroud)

    或者eg2

     cp .../yourpackage/ src/
    
    Run Code Online (Sandbox Code Playgroud)
  4. 构建包

     # -us -uc skips package signing.
     dpkg-buildpackage -us -uc
    
    Run Code Online (Sandbox Code Playgroud)

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

更多细节

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

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

这两个项目都有"主干"和"包"分支,您可以debian/在包分支中看到该文件夹.这里最重要的两个文件是debian/controldebian/rules - 我已经链接到'browse source'.

最后

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

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


tex*_*tex 5

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

从rubygems抓取它:

gem install fpm
Run Code Online (Sandbox Code Playgroud)

构建二进制文件(例如foobar)后,可以像这样打包:

fpm -s dir -t deb -n foobar -v 0.0.1 foobar=/usr/bin/
Run Code Online (Sandbox Code Playgroud)

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


ale*_*xei 5

There is an official Debian policy document describing the packaging procedure for Go: https://go-team.pages.debian.net/packaging.html

For libraries: Use dh-make-golang to create a package skeleton. Name your package with a name derived from import path, with a -dev suffix, e.g. golang-github-lib-pq-dev. Specify the dependencies ont Depends: line. (These are source dependencies for building, not binary dependencies for running, since Go statically links all source.)

Installing the library package will install its source code to /usr/share/golang/src (possibly, the compiled libraries could go into .../pkg). Building depending Go packages will use the artifacts from those system-wide locations.

For executables: Use dh-golang to create the package. Specify dependencies in Build-Depends: line (see above regarding packaging the dependencies).