为什么使用sbuild而不是pbuilder?
有许多方法可以在干净且可重现的环境中构建Debian软件包。 最常用的两个是pbuilder和sbuild。 就个人而言,我总是使用pbuilder。 我发现pbuilder更容易使用和维护。 我无法找到两者的并排比较。 我错过了什么?
使用sbuild而不是pbuilder有什么优势?
sbuild和pbuilder多年来已经开发出具有几乎相同的function,并且随着function被添加到其中,它们往往被另一个快速采用。
由于Debian打包是一种策略驱动的格式,因此它可以帮助确定给定的构建问题是否是构建器实现中的错误,或者构建的包是否存在构建系统的多个实现的问题。 为了保持这一点,领先的构建系统必须都有强大的支持他们的支持者,本着协作竞争的精神,确保我们拥有最正确的可用政策实施。
sbuild和pbuilder的内部机制差别很大,因此精确地拉出哪些包以满足构建依赖性或它们如何被拉动,调用debian /规则中的各种目标的精确机制等可能会有所不同,从而导致一些轻微的某些包裹在特定情况下的行为差异。 大多数情况下,这代表了一个或另一个实施中的错误,有时反映出包装政策缺乏明确性:无论如何,行为改变应该得到解决。
Debian和Ubuntu中的官方内置使用sbuild(虽然通常不是档案中提供的sbuild),这被一些开发人员认为是一个优势,因为他们更有信心他们的配置与他们的包在构建时将暴露的相匹配,虽然如果每个人都这样做,我们就失去了区分策略中的错误和sbuild中的错误的能力。
从历史上看,我的理解是pbuilder开发最初关注开发人员的需求,因为最终用户和sbuild开发最初关注的是构建和归档管理员的需求。 最近,随着人们建立了基于pbuilder的归档管理系统,以及使用sbuild的更有用的开发人员工具,这些重点已经转变。
这两种工具(或它们通常可用的紧密衍生产品)支持将chroot存储为tarball,在系统上解压缩,在单独的卷中(具有用于特殊安装的可用挂钩:例如LVM快照),使用覆盖文件系统,使用写时复制语义等这两个工具都提供了简单的命令行工具来简化常见情况(测试构建包)和丰富的钩子语义来支持复杂的案例(大型档案)。 两者都提供了在chroot中创建测试环境的方法。 简而言之,这两种工具在包构建工具中提供了您可能认为想要的任何内容(并且两者都有活跃的上游很乐意接受错误和补丁)。
总结:如果你对pbuilder感到满意,请继续使用它。 如果你想玩sbuild,请随意。 最好的工具是您可以轻松使用的工具。
不同意Emmet总是很危险的,所以让我首先承认他的答案可能更正确。 但是,我个人认为pbuilder更加用户友好,开箱即用。
如果您使用的是Ubuntu 12.10或更高版本,请务必安装优秀的pbuilder脚本,这是一组围绕原始pbuilder 非常友好的包装器。
如果您使用的是Ubuntu 12.04,则可以从backports存储库安装pbuilder脚本。
现在,让我们比较和对比等效操作的用户友好性。 在这些示例中,我将使用托管在x86上的ARM chroot,但这些概念仍适用于x86上托管的x86 chroot。 记住,我正在使用pbuilder-scripts包装器。
需要注意的一点是,pbuilder脚本实现了一些约定,类似于Ruby on Rails为您做出一些决定,以便您可以快速进行。 我们会尽力指出这些。
创建一个chroot
mk-sbuild --arch=armhf quantal
VS
# in addition to the chroot, creates a new, empty directory named ~/Projects/quantal-armhf pcreate -a armhf -d quantal quantal-armhf
判决: tie ,两个命令行都非常简单,如果需要,两者都可以为更高级的用例提供额外的选项。 但是,请注意pcreate创建的其他新目录。
下载源包
# standard debian/ubuntu method, works in any directory apt-get source casper
与
# 'quantal-armhf' is the name of the chroot created earlier # results in downloading package to: ~/Projects/quantal-armhf/casper/ pget quantal-armhf casper
判决: sbuild略有优势 ,因为你正在使用标准的debian / ubuntu最佳实践。 pget使用的约定起初可能看起来很奇怪,但由于我在Ubuntu的多个版本中处理多个包,我喜欢它所强加的组织。 另请注意,apt-get source还会在您运行命令的任何位置提取源,为您留下* .orig.tar.gz,* .debian.tar.gz,* .dsc和扩展目录,我个人认为很乱。 我保证,组织的美丽即将到来。
输入chroot,短暂版本
schroot -c quantal-armhf
与
ptest quantal-armhf
结论: pbuild略有边缘,输入的字符越少,字符越少。 请注意,在此版本的chroot中,一旦退出chroot,您在此处所做的任何更改都将丢失。 另请注意,在schroot中,您将保持普通用户,而使用ptest,您将作为root用户进入chroot。
输入chroot,保存更改版本
sudo schroot -c quantal-armhf-source -u root
与
ptest quantal-armhf --save
结论:在我看来,pbuild略有优势 ,字符更少,命令行参数更直观。 在这个输入chroot的版本中,您在其中进行的任何更改都将保存以供将来调用。
在chroot中构建一个包
debuild -S -sa -I -i sbuild -A --arch armhf -d quantal-armhf /path/to/casper-1.315.dsc
与
# must be invoked when pwd is ~/Projects/quantal-armhf/casper/casper-1.315 pbuild
判决: pbuild ,现在我们看到使用pbuild的约定时的第一个重大胜利。 这是一个简单的命令,除了指定体系结构,chroot的名称以及需要sbuild所需的* .dsc文件的路径之外,没有别的东西需要记住。 此外,您必须记住使用sbuild生成新的* .dsc文件,而pbuild将自动为您执行此操作。
第二次在chroot中构建相同的包
在上面的例子中,sbuild和pbuild都将在各自的chroot中下载并安装build-deps。 但是,pbuild 会将下载的.deb文件保存在/ var中,因此如果再次调用pbuild,则不必再次下载所有build-deps(尽管它们仍必须安装在chroot中)。 sbuild不会缓存.deb文件(至少在默认情况下不会),因此,除了等待它们安装在chroot中之外,还必须再次下载所有build-deps。
判决: pbuild一个远射。 缓存build-deps是一个很好的默认设置,pbuild非常智能,可以检测存档中是否有更新版本的build-dep,并在需要时下拉新版本。 对于包含许多build-deps的复杂包,这个简单的设置将为您节省几分钟的生命。
摘要
开箱即用,我发现pbuilder脚本比sbuild等价物更友好,更快。 当然,有一些方法可以让pbuilder更快(在tmpfs中构建,禁用一些chroot挂钩),并且sbuild也可能有相同的技巧,但我不知道它们。
希望这可以帮助。