Windows如何处理程序依赖关系?

我已经使用了很长一段时间的Linux,而且我总是想知道Windows如何能够处理诸如apt-get , aptitude , Pacman , yum和其他软件包pipe理者所能够执行的程序。 有时候,我的软件包pipe理员会告诉我,这个软件包的版本是这个软件包所需要的,或者会有一些冲突。

Windows如何处理所有这些东西?

它不。 除非我们正在讨论.NET ,它要求您根据编译器安装框架版本X.

其他一切只是抛出一个错误。 运气好的话,你会missing dll xxxx.dll 。 尽pipe大多数安装程序将包含运行该软件所需的库。

编辑4/4/2014:嘿OP,看看今天刚刚发布的内容:

http://blogs.technet.com/b/windowsserver/archive/2014/04/03/windows-management-framework-v5-preview.aspx


我只是想在接受的答案上扩大一点,因为细节上有点稀疏。 Filipe的答案没有提到Windows实际用来解决或缓解程序依赖性问题的策略,如组件存储(WinSxS),全局程序集caching,MSI系统等。但另一方面,他基本上是正确的意识到开发人员有责任在应用程序中包含任何自定义库,并在提交安装事务之前检查是否存在依赖关系。

Windows比Linux更模块化,它有正面和负面的作用。 另一方面,Windows更单一,意味着操作系统的组件相对较less,可以像Linux一样可移动或可选。 (尽pipeWindows正在慢慢变好。)

但是另一方面,这意味着开发人员可以对用户在自己的机器上已经存在的库有更多的假设。 并且这些库的各种版本一旦安装,将被并行存储在组件存储中,以便您不再需要App1咆哮需要crapDLL.dll,并且App2咆哮需要不同版本的crapDLL.dll时间等

在Windows中,由软件作者为其库提供版本。 Windows有一些设施可以帮助解决这个问题。

与安装程序(.msi)交互的Windows Installer和Trusted Installer服务。 还有一些称为“隔离应用程序”和“并行程序集”的支持技术可帮助您理清版本冲突。

对于.NET框架应用程序,有全局程序集caching,强命名程序集和核心清单。

在Windows 8和8.1中,有Windows App Store和Windows运行时库(win32 APIreplace)。

编辑:这些技术大部分的核心是汇编清单,提供版本号的embedded式文件,作者,相关程序集及其版本,以及其他数据。

其他答案也正确地指出,包pipe理和操作系统是不同的想法,但没有提到一个解决scheme。

在Windows上,apt-get或yum最类似的软件包pipe理系统目前是Chocolatey 。 它允许用户安装/卸载软件包(msi,exe,powershell脚本),这些软件包可以包含有关其依赖关系的信息,这些信息可以由Chocolatey自动解决。

该软件包通常包含指向二进制文件和脚本的链接以pipe理安装过程。 该软件包还可以包含二进制文件或任何其他必需的文件(依赖项应该在一个单独的软件包中)。 Chocolatey也可以使用微软的Web Platform Installer ,Ruby Gems,Python等外部包pipe理系统。

据我所知,Windows处理的唯一依赖是Microsoft特定的库。 如果你安装了一个像Blender这样的Windows开源程序,它将在它自己的单独的dll文件中包含libavcodec和ffmpeg库,如果你安装了OpenShot,它将安装它自己的副本libavcodec在它自己的目录中,而且它们可以是完全不同的版本。 这可能是一个噩梦,当卸载软件来清理遗留的垃圾,它也占用了更多的磁盘空间与库冗余。