供应商的二进制包格式select看起来是由墨菲定律的forms决定的:所有你不使用的发行版都有包。 (Corralary:不存在满足您的软件堆栈分布依赖性的分布)。
这是政治问题,还是更深层次的问题,我们还没有看到“一次build造,随处运行”的包装forms的出现?
这个引用Joel Spolsky似乎是适当的:
(顺便说一句,对于那些追随神秘的,但政治上充满了博客聚合饲料格式世界的人,你可以看到同样的事情发生在那里,RSS变得分散了几个不同的版本,不准确的规格和大量的政治斗争,而通过创build另一种称为Atom的格式来清理所有事情的尝试已经导致RSS的几个不同版本加上一个版本的Atom,不准确的规范和大量的政治斗争当您尝试通过创build第三个替代scheme来统一两个对立的力量时,你最后只有三个对立的力量,你没有统一任何东西,你也没有确定任何东西。)
(强调加)
你有(至less)两个用于Linux的包装系统。 这实际上是一件好事。 一个系统将简单地创build第三个系统。
这有很多原因,有一些历史是为了把事情放在一个angular度。
请记住,当我们谈论“Linux”时,我们通常所指的是许多不同的Linux发行版之一 。 “Linux”实际上只是一个操作系统内核。
Linux的最初目标是创build一个基于Unix的系统,可以在PC上运行(最初是386)。 第一步是创build内核本身。 当Linus Torvalds正在研究内核时, Richard Stallman正在GNU(GNU的非Unix)项目下开发自己的Free Unix系统。 长话短说,两者有点融合,因为GNU有相关的工具(C编译器/库/构build工具,shell,文本编辑器等),但没有核心来运行它,Linux有核心,但没有实用程序在其上面运行,使其对大众有用。
这种融合在某种程度上被称为GNU / Linux。 你会看到很多发行版仍然将自己称为GNU / Linux发行版。
由于GNU / Linux的自由和开放性,任何人都可以select它并创build一个捆绑系统来满足他们特定的需求。 其结果是,许多不同的configuration方法stream被用来创build这些系统,这些系统的副作用是创build几乎同样多的不同的包pipe理系统以适应每个系统。
每一个不同的完整系统都有自己的强大的追随者,多年来一直坚持下去,结果形成了我们今天所拥有的: RPM , APT / dpkg和Gentoo Portage等广泛使用的,根深蒂固和稳定的软件包pipe理系统。
有些项目如Autopackage试图解决这个问题,但是各种支持的包pipe理系统的不断发展意味着有许多移动目标需要遵循。
一些软件供应商最终做的是将特定的二进制文件和它们所需的依赖关系的拷贝捆绑到一个可以在特定系统上工作的大型软件包中。
拥有相同的封装格式无论如何也无济于事。 你不能在其他发行版中使用相同的软件包。 你甚至不能经常在相同发行版的不同版本中使用它。 甚至build筑包也可能有同样的问题。
要安装软件包,您需要满足在构build软件包期间形成的依赖关系。 要构build一个包,你需要满足构build依赖。 而这些事情变了。 为了能够实现这些更改,仅支持可以在修改之后修改的软件包。
如果所有的依赖关系都是相同的,那么它将不会是一个不同的发行版本或者同一发行版本的不同版本。
我想,这里有一些“这里没有发明的综合症”。 Debian的打包系统早于RedHat,但在许多方面都优于Debian,但是你永远不会看到RedHat的切换。 相反,你会看到很多使用“apt-rpm”的人试图给你一些apt文件的优点。
只要去.deb 🙂
有几种尝试性的格式,如零安装和自动包装 。 不幸的是没有任何牵引。
韦恩,我认为这是很好的答案。 我想补充说,这不是一个大问题。 我在有Gentoo(portage),SUSE(rpm / zypper)和OpenBSD(包和端口)的混合环境中工作。 在其中的任何一个上安装软件包并不困难,我也不在乎他们使用的是什么格式。
从包装软件的angular度来看,也不是非常困难。 不pipe是Gentoo,一个基于RPM的发行版,还是一个基于deb的发行版,它都归结为制作软件和添加元数据的配方。 假设你想要打包的构build系统并不完全是疯狂的,通常只需要编写一个美化的shell脚本来创build一个包就可以了。
那么总是有静态编译的二进制文件在焦油球…. 😉
“Linux”没有标准二进制接口的定义,因为这只是一个内核。 有可能你的软件栈需要的不仅仅是你的内核的接口,而是要在数百个不同的源代码树之间维护一个标准的ABI。
关于优秀打包工具的话题,我更喜欢Debian GNU / Linux,因为它是非常好的二进制打包格式。 它已经满足了我对标准工具和应用程序的90%的需求。 剩下的10%是由于包含非自由组件或错误共享库依赖项而从源代码生成的。 当需要部署这些应用程序时,我将为生产群集构build自定义二进制文件。
要构build一次,运行任何地方的包格式,而不强迫每个人使用相同的分配,你需要一些重要的function:
全球唯一的软件包命名,使两个人/发行版不能独立创build具有相同名称的不同软件包。
当包有冲突的需求时,能够并行安装不同版本的库。 发行版可以决定要使用哪个版本的库,并强制所有包使用该版本。 跨分布的系统必须更加灵活。
零安装提供了这两个function:
名称是URI(例如http://rox.sourceforge.net/2005/interfaces/ROX-Filer )。 只有域的所有者可以在该命名空间内默认创build包。
每个软件包的每个版本都在自己的目录中。 每个应用程序只看到它所需要的库,以及它所兼容的版本。
例如, Edit应用程序依赖于Python <3:
<command name="run" path="Edit/AppRun"> <runner interface="http://repo.roscidus.com/python/python"> <version before="3"/> </runner> </command>
另见: http : //www.osnews.com/story/16956/Decentralised-Installation-Systems
[注:我是一个0install开发者]