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
视而不见,您坚持认为,这不是问题.这两种方法都意味着您不会尝试通过打包工具构建应用程序,而是将其视为仅包装到包中的blob.这将需要从正常的debian/rules
工作方式略微抽象(不试图建立任何东西).
另一种可能的解决方案(实际上更像Debian-ish)是尝试使用gcc-go
(加上gold
链接):因为它是一个GCC前端,这个工具产生一个动态链接的应用程序(链接libgo
或类似的东西)这个).我个人来说,它还没有使用它的经验,如果你打算尝试将你的软件包推入适当的Debian,我会考虑使用它.
关于为Debian打包Go程序的一般问题,您可能会发现以下资源非常有用:
2015-10-15 更新.
(由于这篇文章似乎仍然被人们搜索和发现和研究,我决定更新它以更好地反映当前的状况.)
从那时起,包装Go应用程序和软件包的情况得到了显着改善,并且可以使用"经典"Go(所谓的gc
来自Google的套件)而不是使用gcc-go
.来构建Debian软件包.并且存在良好的包装基础设施.
现在将dh-golang
描述在对Go程序进行debian化时使用的关键工具.
lah*_*her 16
我自己一直在调查,我基本上就在那里.
通过从Canonical现有的Go项目中的'package'分支"借用",您可以使用dpkg-buildpackage构建包.
安装依赖项并从另一个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)编辑元数据.
Build-Depends: debhelper (>= 7.0.50~), golang-stable
)和3架构.使用Ubuntu(没有gophers ppa),我不得不将golang-stable改为golang-go.cd $(GOPATH)/src && find * -name '*.go' -exec dirname {} \; | xargs -n1 go install
将您的源放在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)构建包
# -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/control和debian/rules - 我已经链接到'browse source'.
我没有涉及的是交叉编译你的包(到3,386/arm/amd64的其他2个架构).交叉编译不是太棘手(你需要为每个目标平台构建工具链,然后在'go build'期间设置一些ENV变量),我自己一直在研究交叉编译器实用程序.最终我希望将.deb支持添加到我的实用程序中,但首先我需要明确这项任务.
祝好运.如果您取得任何进展,请更新我的答案或添加评论.谢谢
使用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支持各种高级包装选项。
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).