打包去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覆盖” ,可以用来使
lintian
对select的问题视而不见,你坚持认为,这不是问题。
这两种方法都意味着你不要试图用打包工具来构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您的软件包。
-
安装依赖关系,并从另一个仓库获取“包”分支。
# 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
-
编辑元数据。
- 编辑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
- 同时更新版权文件,自述文件,许可证等
-
把你的源文件放在src文件夹中。 例如
git clone https://github.com/yourgithubusername/yourpackagename src/github.com/yourgithubusername/yourpackagename
或eg2
cp .../yourpackage/ src/
-
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/ – 我很满意他们在做什么。 也许打开一个包,看看他们在做什么?