如何将我的 Go 二进制文件放入 Debian 包中?由于 Go 是静态链接的,我只有一个可执行文件——我不需要很多复杂的项目元数据信息。有没有一种简单的方法来打包可执行文件和资源文件而不会经历 的创伤debuild
?
我已经到处寻找现有的问题;然而,我所有的研究都提出了关于包含 golang 开发环境的 .deb 文件的问题/答案(即,如果你这样做,你会得到什么sudo apt-get install golang-go
)。
好。我认为唯一的“创伤”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
. 并且还有一个很好的包基础设施。
现在dh-golang
描述了在对 Go 程序进行 debian 时使用的关键工具。
我自己一直在研究这个,我基本上就在那里。
通过从 Canonical 现有 Go 项目之一的“包”分支中“借用”,您可以使用 dpkg-buildpackage 构建您的包。
安装依赖项并从另一个仓库中获取“包”分支。
# 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 文件夹中。例如
git clone https://github.com/yourgithubusername/yourpackagename src/github.com/yourgithubusername/yourpackagename
或 eg2
cp .../yourpackage/ src/
构建包
# -us -uc skips package signing.
dpkg-buildpackage -us -uc
这应该为您的体系结构生成一个二进制 .deb 文件,以及“源 deb”(.tgz)和源 deb 描述文件(.dsc)。
所以,我意识到 Canonical(Ubuntu 人)正在使用 Go,并为他们的一些 Go 项目构建 .deb 包。Ubuntu 基于 Debian,因此在大多数情况下,相同的方法应该适用于两个发行版(依赖项名称可能略有不同)。
您会在 Ubuntu 的 Launchpad 存储库中找到一些基于 Go 的软件包。到目前为止,我已经找到了 cobzr(bzr 的 git 风格分支)和juju-core(一个 devops 项目,从 Python 移植而来)。
这两个项目都有一个“主干”和一个“包”分支,您可以看到debian/
包分支内的文件夹。这里最重要的 2 个文件是debian/control和debian/rules - 我已链接到“浏览源”。
我没有涉及的是交叉编译你的包(到 3、386/arm/amd64 的其他 2 个架构)。交叉编译在 go 中并不太棘手(您需要为每个目标平台构建工具链,然后在“go build”期间设置一些 ENV 变量),我自己一直在研究交叉编译器实用程序。最终,我希望将 .deb 支持添加到我的实用程序中,但首先我需要明确这项任务。
祝你好运。如果您取得任何进展,请更新我的答案或添加评论。谢谢
使用 fpm 从 Go 应用程序构建 deb 或 rpm 包也非常容易。
从 rubygems 中获取:
gem install fpm
在构建你的二进制文件后,例如 foobar,你可以像这样打包它:
fpm -s dir -t deb -n foobar -v 0.0.1 foobar=/usr/bin/
fpm 支持各种高级封装选项。
有一个官方的 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:
项(有关打包依赖项的信息,请参见上文)。
我最近发现了https://packager.io/ - 我对他们正在做的事情感到非常满意。也许打开其中一个包看看他们在做什么?