jldugger Asked: 2009-05-24 16:54:19 +0800 CST2009-05-24 16:54:19 +0800 CST 2009-05-24 16:54:19 +0800 CST 为什么 Linux 开发者不能创建通用的打包格式? 772 供应商二进制包格式选择似乎由墨菲定律的一种形式确定:您不使用的所有发行版都有包。(Corralary:不存在满足您的软件堆栈的分发依赖性的分发)。 这是一个政治问题,还是更深层次的问题,我们还没有看到“一次构建,随处运行”的包格式的出现? linux packaging 10 个回答 Voted cletus 2009-05-24T18:46:09+08:002009-05-24T18:46:09+08:00 在这个问题上引用Joel Spolsky似乎是合适的: (顺便说一句,对于那些关注神秘但充满政治色彩的博客联合提要格式世界的人来说,你会看到同样的事情发生在那里。RSS 变得支离破碎,有几个不同的版本、不准确的规范和大量的政治斗争,并且试图通过创建另一种名为 Atom 的格式来清理一切导致了几个不同版本的 RSS 加上一个版本的 Atom,不准确的规范和大量的政治斗争。当你试图通过创建第三种替代方案来统一两种对立的力量时,你只是以三种对立的力量结束。你没有统一任何东西,你也没有真正解决任何问题。) (重点补充) 你有(至少)两个 Linux 打包系统。这实际上是一件好事。单个系统将简单地创建第三个系统。 Wayne Koorts 2009-05-24T17:36:44+08:002009-05-24T17:36:44+08:00 造成这种情况的原因有很多,一点历史是为了把事情放在眼里。 请记住,当我们谈论“Linux”时,我们通常指的是许多不同的Linux 发行版之一。“Linux”实际上只是一个操作系统内核。 Linux 最初的目标是创建一个可以在 PC(最初是 386)上运行的基于 Unix 的系统。第一步是创建内核本身。当Linus Torvalds正在研究内核时,Richard Stallman正在研究他自己的Free Unix 系统,在GNU(GNU's Not Unix)项目下。长话短说,这两者有些融合,因为 GNU 有相关的实用程序(C 编译器/库/构建工具、shell、文本编辑器等)但没有运行它的核心,而 Linux 有核心但没有实用程序来运行它在它上面运行以使其对大众有用。 这种融合在某种程度上被正式称为 GNU/Linux。您会看到许多发行版仍然将自己称为 GNU/Linux 发行版。 由于 GNU/Linux 的自由和开放特性,任何人都可以选择它并创建一个符合他们特定口味的捆绑系统。结果是使用了许多不同配置方法的不同流来创建这些系统,这产生了创建几乎与每个系统一样多的不同包管理系统的副作用。 每个不同的完整系统都有自己强大的追随者,多年来一直坚持使用它们,从而产生了我们今天所拥有的:少数广泛使用、根深蒂固且稳定的包管理系统,例如RPM、APT / dpkg和 Gentoo 的Portage。 有一些项目,例如Autopackage,正试图解决这个问题,但各种支持的包管理系统的不断发展意味着有许多移动目标需要遵循。 一些软件供应商最终所做的是将他们需要的特定二进制文件和依赖项副本捆绑到一个可以在特定系统上运行的大包中。 iny 2009-05-25T02:51:43+08:002009-05-25T02:51:43+08:00 无论如何,拥有相同的包格式无济于事。您只是不能在其他发行版中使用相同的包。您甚至不能经常在同一发行版的不同版本中使用它。甚至构建包也会有同样的问题。 要安装软件包,您需要满足在构建软件包期间形成的依赖关系。要构建一个包,您需要满足构建依赖项。而这些事情发生了变化。为了能够实施更改,仅支持您可以修改以在更改后工作的包更容易。 如果所有依赖项都相同,则它不会是不同的发行版或同一发行版的不同版本。 Paul Tomblin 2009-05-24T17:32:39+08:002009-05-24T17:32:39+08:00 我认为有一点“这里没有发明综合症”。Debian 的打包系统早于 RedHat,但它在许多方面都更胜一筹,但您永远不会看到 RedHat 切换。相反,您会看到很多人使用“apt-rpm”,试图通过 rpm 文件为您提供 apt 的一些优点。 amh 2009-05-31T10:02:59+08:002009-05-31T10:02:59+08:00 去.deb :-) wazoox 2009-07-17T05:05:26+08:002009-07-17T05:05:26+08:00 有几种暂定格式,例如zero-install和autopackage。不幸的是,没有人获得任何牵引力。 Kamil Kisiel 2009-08-28T15:03:28+08:002009-08-28T15:03:28+08:00 我认为 cletus、Wayne 和 iny 很好地回答了这个问题。我真的想补充一点,这不是什么大不了的事。我在一个混合环境中工作,我们有 Gentoo(portage)、SUSE(rpm/zypper)和 OpenBSD(包和端口)。在其中任何一个上安装软件包并不困难,而且我并不关心它们使用什么格式。 从打包软件的角度来看,也不是很困难。无论是基于 RPM 的发行版 Gentoo,还是基于 deb 的发行版,它实际上都归结为拥有构建软件和添加一些元数据的配方。如果您尝试打包的构建系统并非完全疯狂,通常只需要编写一个美化的 shell 脚本来创建一个包。 Jason Tan 2009-05-31T09:14:29+08:002009-05-31T09:14:29+08:00 好吧,tar 球中总是有静态编译的二进制文件.... ;-) lee 2009-08-28T11:31:34+08:002009-08-28T11:31:34+08:00 “Linux”没有标准二进制接口的定义,因为它只是一个内核。很可能您的软件堆栈需要与内核以外的接口进行交互,这对在数百个不同的源代码树之间维护标准 ABI 提出了特殊挑战。 关于优秀的打包工具,我更喜欢 Debian GNU/Linux,因为它具有出色的二进制打包格式。它满足了我对标准工具和应用程序的 90% 的需求。由于包含非自由组件或有缺陷的共享库依赖项,其余 10% 是从源代码构建的。当需要部署这些应用程序时,我会为生产集群构建自定义二进制文件。 user5746 2011-09-18T13:11:11+08:002011-09-18T13:11:11+08:00 要获得一次构建,随处运行的包格式,而不强迫每个人使用相同的发行版,您需要几个重要功能: 全局唯一的包命名,使两个人/发行版不能独立创建具有相同名称的不同包。 当包有冲突的要求时并行安装不同版本的库的能力。发行版可以决定使用每个库的哪个版本,并强制所有包使用该版本。跨发行版工作的系统必须更加灵活。 零安装提供以下两个功能: 名称是 URI(例如http://rox.sourceforge.net/2005/interfaces/ROX-Filer)。默认情况下,只有域的所有者才能在该命名空间内创建包。 每个包的每个版本都放在自己的目录中。每个应用程序只看到它需要的那些库,以及它兼容的版本。 例如,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 开发人员]
在这个问题上引用Joel Spolsky似乎是合适的:
(重点补充)
你有(至少)两个 Linux 打包系统。这实际上是一件好事。单个系统将简单地创建第三个系统。
造成这种情况的原因有很多,一点历史是为了把事情放在眼里。
请记住,当我们谈论“Linux”时,我们通常指的是许多不同的Linux 发行版之一。“Linux”实际上只是一个操作系统内核。
Linux 最初的目标是创建一个可以在 PC(最初是 386)上运行的基于 Unix 的系统。第一步是创建内核本身。当Linus Torvalds正在研究内核时,Richard Stallman正在研究他自己的Free Unix 系统,在GNU(GNU's Not Unix)项目下。长话短说,这两者有些融合,因为 GNU 有相关的实用程序(C 编译器/库/构建工具、shell、文本编辑器等)但没有运行它的核心,而 Linux 有核心但没有实用程序来运行它在它上面运行以使其对大众有用。
这种融合在某种程度上被正式称为 GNU/Linux。您会看到许多发行版仍然将自己称为 GNU/Linux 发行版。
由于 GNU/Linux 的自由和开放特性,任何人都可以选择它并创建一个符合他们特定口味的捆绑系统。结果是使用了许多不同配置方法的不同流来创建这些系统,这产生了创建几乎与每个系统一样多的不同包管理系统的副作用。
每个不同的完整系统都有自己强大的追随者,多年来一直坚持使用它们,从而产生了我们今天所拥有的:少数广泛使用、根深蒂固且稳定的包管理系统,例如RPM、APT / dpkg和 Gentoo 的Portage。
有一些项目,例如Autopackage,正试图解决这个问题,但各种支持的包管理系统的不断发展意味着有许多移动目标需要遵循。
一些软件供应商最终所做的是将他们需要的特定二进制文件和依赖项副本捆绑到一个可以在特定系统上运行的大包中。
无论如何,拥有相同的包格式无济于事。您只是不能在其他发行版中使用相同的包。您甚至不能经常在同一发行版的不同版本中使用它。甚至构建包也会有同样的问题。
要安装软件包,您需要满足在构建软件包期间形成的依赖关系。要构建一个包,您需要满足构建依赖项。而这些事情发生了变化。为了能够实施更改,仅支持您可以修改以在更改后工作的包更容易。
如果所有依赖项都相同,则它不会是不同的发行版或同一发行版的不同版本。
我认为有一点“这里没有发明综合症”。Debian 的打包系统早于 RedHat,但它在许多方面都更胜一筹,但您永远不会看到 RedHat 切换。相反,您会看到很多人使用“apt-rpm”,试图通过 rpm 文件为您提供 apt 的一些优点。
去.deb :-)
有几种暂定格式,例如zero-install和autopackage。不幸的是,没有人获得任何牵引力。
我认为 cletus、Wayne 和 iny 很好地回答了这个问题。我真的想补充一点,这不是什么大不了的事。我在一个混合环境中工作,我们有 Gentoo(portage)、SUSE(rpm/zypper)和 OpenBSD(包和端口)。在其中任何一个上安装软件包并不困难,而且我并不关心它们使用什么格式。
从打包软件的角度来看,也不是很困难。无论是基于 RPM 的发行版 Gentoo,还是基于 deb 的发行版,它实际上都归结为拥有构建软件和添加一些元数据的配方。如果您尝试打包的构建系统并非完全疯狂,通常只需要编写一个美化的 shell 脚本来创建一个包。
好吧,tar 球中总是有静态编译的二进制文件.... ;-)
“Linux”没有标准二进制接口的定义,因为它只是一个内核。很可能您的软件堆栈需要与内核以外的接口进行交互,这对在数百个不同的源代码树之间维护标准 ABI 提出了特殊挑战。
关于优秀的打包工具,我更喜欢 Debian GNU/Linux,因为它具有出色的二进制打包格式。它满足了我对标准工具和应用程序的 90% 的需求。由于包含非自由组件或有缺陷的共享库依赖项,其余 10% 是从源代码构建的。当需要部署这些应用程序时,我会为生产集群构建自定义二进制文件。
要获得一次构建,随处运行的包格式,而不强迫每个人使用相同的发行版,您需要几个重要功能:
全局唯一的包命名,使两个人/发行版不能独立创建具有相同名称的不同包。
当包有冲突的要求时并行安装不同版本的库的能力。发行版可以决定使用每个库的哪个版本,并强制所有包使用该版本。跨发行版工作的系统必须更加灵活。
零安装提供以下两个功能:
名称是 URI(例如http://rox.sourceforge.net/2005/interfaces/ROX-Filer)。默认情况下,只有域的所有者才能在该命名空间内创建包。
每个包的每个版本都放在自己的目录中。每个应用程序只看到它需要的那些库,以及它兼容的版本。
例如,Edit应用程序依赖于 Python < 3,如下所示:
另见:http ://www.osnews.com/story/16956/Decentralised-Installation-Systems
[注:我是 0install 开发人员]