题 Windows如何处理程序依赖性?


我已经使用Linux了很长一段时间,我总是想知道Windows如何能够处理程序依赖性 apt-get的能力倾向吃豆子百胜 和其他包管理员能够。有时,我的包管理器会告诉我该包需要该库的这个版本,否则会有一些冲突。

Windows如何处理所有这些内容?


22
2018-03-23 18:25




视窗 不 处理版本依赖。大多数版本安装程序都可以如果您还不熟悉它,请查看InnoSetup: jrsoftware.org/isinfo.php - paulsm4
值得注意的是,即使在你的例子中,它也不是 Linux的 本身就是管理依赖关系 - 它是包管理器。 - GalacticCowboy
Windows如何处理程序依赖性?很糟糕,根据我的经验。 - rlms


答案:


它没有。除非我们在谈论 。净 根据编译器要求您安装框架版本X.

其他一切只会引发错误。幸运的是,你得到了 missing dll xxxx.dll。尽管如此,大多数安装程序都会包含所需的库以运行该软件。


29
2018-03-23 18:32



那么每个程序的安装程序都要检查依赖性吗?因此,如果安装程序糟透了,您可能根本无法使用该程序。 - Nico
忘了说,不,你可以使用then程序,但你必须弄清楚它需要哪个DLL或框架。 - Filipe YaBa Polido
@Filipe所以你必须安装V C ++ 运行时是你讨厌.NET软件的原因吗?此外,Windows默认情况下已经安装了.NET框架,因此如果您定位正确的版本,它将开箱即用。而且,由于显而易见的原因,您必须下载并安装缺少的共享对象的事实并不局限于任何特定的软件/语言/框架(您也可以在* nix中具有相同的“问题”)。 - Voo
@FilipeYaBaPolido:由于VC ++ 2008运行时用于C ++应用程序,而不是.Net应用程序,因此您的仇恨特别错位。显然.Net应用程序需要.Net框架和C ++应用程序需要C ++框架(运行时),非常简单。现在,一个特定的软件包可能包含C ++和.Net部分,因此这两个部分并不是唯一的。 - MSalters
伙计们放松,我不讨厌.Net或VC ++。我甚至在需要时编写.Net / C#代码,这是一个工具。但我使用一些不同的工具,看看差异。对不起,如果我解释错了。 - Filipe YaBa Polido


编辑2014年4月4日:嘿OP,看看今天发布的内容:

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


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

Windows的模块化程度低于Linux,后者具有正面和负面效果。另一方面,Windows更加单一,意味着操作系统的组件相对较少,可移动或可选,如Linux。 (尽管Windows正在逐渐变得更好。)

但从好的方面来说,这意味着开发人员能够对用户已经在他或她的机器上存在的库做出更多假设。一旦安装,将存储这些库的各种版本 并排 在组件存储中,所以你不再让App1咆哮需要crapDLL.dll,而App2咆哮着同时需要不同版本的crapDLL.dll等等。


40
2018-03-23 19:23



谢谢瑞恩。我知道我应该详细说明我的答案,但由于英语不是我的主要语言,我仍然有一些困难要表达自己。 - Filipe YaBa Polido
很好描述。但是,我会说它在服务器端变得更加模块化 - 核心/ gui-free选项,角色和基于功能的设置。 - EricB
我今天早上看了这篇文章,它让我想起了这篇文章。这是一个有趣的,虽然切向阅读这个主题: blogs.msdn.com/b/oldnewthing/archive/2014/04/11/10516280.aspx - Ryan Ries


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

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

对于.NET框架应用程序,有全局程序集缓存,强名称程序集,以及核心清单。

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

编辑: 大多数这些技术的核心是程序集清单,提供版本号的嵌入式文件,作者,依赖程序集及其版本以及其他数据。


9
2018-03-23 19:28





其他答案确实正确指出包管理和操作系统是不同的想法,但没有提到解决方案。

目前,在Windows上最适合apt-get或yum的软件包管理系统 巧克力味。它允许人们安装/卸载软件包(msi,exe,powershell脚本),这些软件包可以包含有关其依赖关系的信息,可以由Chocolatey自动解决。

该程序包通常包含指向用于管理安装过程的二进制文件和脚本的链接。该包还可以包含二进制文件或任何其他所需的文件(依赖项应该在单独的包中)。 Chocolatey还可以使用像Microsoft这样的外部包管理系统 Web平台安装程序, Ruby Gems,Python等。


5
2018-03-24 18:03



绝对!还有一些第三方软件包管理器也可以在Windows上运行。我能说出的唯一一个就是NuGet,它是一个内置于Visual Studio中的应用程序开发人员的包/依赖管理器。这就是说我相信这个问题更多的是寻找操作系统如何处理包,其中这些解决方案更多地关注用户如何处理包。 - Goldfish Sandwich
对不起,我没有提供有关Chocolatey的一些信息。 Chocolatey以Nuget为基础。 Nuget和Nuspec只是一个'东西'和依赖规范的包。对于像.Net(ruby,node,...)这样的软件框架,依赖关系通常是软件组件(dll,exe,js,...)。这些都是应用程序使用的组件。 - AllenSanborn
在Chocolatey的情况下,虽然包是一个完整的应用程序或应用程序依赖(app,如java,.net,ruby)。 Nuget包中包含PowerShell脚本(也可选择安装程序),它将管理应用程序的安装,Nuspec文件描述应用程序及其具有的依赖关系,例如: Powershell依赖于.Net。还有Boxstarter通过描述机器的配置及其依赖性来提高水平。很整洁的东西。 Boxstarter进入人们使用Chef或Puppet的领域。 - AllenSanborn


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


0
2018-05-04 00:34