如何将Go二进制文件放入Debian包中?由于Go是静态链接的,我只有一个可执行文件 - 我不需要很多复杂的项目元数据信息。是否有一种简单的方法来打包可执行文件和资源文件,而不会经历debuild
的创伤?
我一直在寻找现有的问题;但是,我的所有研究都提出了关于包含golang开发环境的.deb文件的问题/答案(即,如果你sudo apt-get install golang-go
,你会得到什么)。
答案 0 :(得分: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程序的一般问题,您可能会发现以下资源非常有用:
更新。
(由于这篇文章似乎仍然被人们搜索和发现和研究,我决定更新它以更好地反映当前的状况。)
从那时起包装Go应用程序和软件包的情况得到了显着改善,并且可以使用“经典”Go(所谓的gc
套件来源于Google)而不是{{1}来构建Debian软件包。 }}。
并且存在良好的包装基础设施。
现在,gcc-go
描述here时,将对Go程序进行debian化时使用的关键工具。
答案 1 :(得分: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
编辑元数据。
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文件夹中。 e.g。
git clone https://github.com/yourgithubusername/yourpackagename src/github.com/yourgithubusername/yourpackagename
或例如.2
cp .../yourpackage/ src/
构建包
# -us -uc skips package signing.
dpkg-buildpackage -us -uc
这应该为您的架构生成二进制.deb文件,加上'source deb'(。tgz)和源deb描述文件(.dsc)。
所以,我意识到Canonical(Ubuntu人)正在使用Go,并为他们的一些Go项目构建.deb包。 Ubuntu基于Debian,因此在大多数情况下,相同的方法应该适用于两个发行版(依赖项名称可能略有不同)。
你会在Ubuntu的Launchpad资源库中找到一些基于Go的软件包。到目前为止,我已经找到cobzr(bzr的git-style分支)和juju-core(一个devops项目,从Python移植)。
这两个项目都有“主干”和“包”分支,您可以在包分支中看到debian/
文件夹。这里最重要的两个文件是debian/control和debian/rules - 我已链接到“浏览源”。
我没有涉及的是交叉编译你的包(对3,386 / arm / amd64的其他2个架构)。交叉编译不是太棘手(你需要为每个目标平台构建工具链,然后在'go build'期间设置一些ENV变量),我自己一直在研究交叉编译器实用程序。最终我希望将.deb支持添加到我的实用程序中,但首先我需要明确这项任务。
祝你好运。如果您取得任何进展,请更新我的答案或添加评论。感谢答案 2 :(得分:5)
使用fpm,从Go Applications构建deb或rpm包也很容易。
从rubygems中获取它:
gem install fpm
构建二进制文件后,例如foobar,你可以像这样打包:
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/ - 我对他们正在做的事情感到非常满意。也许打开其中一个软件包,看看他们在做什么?