Windows如何处理程序依赖性?


23

我使用Linux已经有一段时间了,我一直想知道Windows如何处理apt-getaptitudePacmanyum和其他程序包管理器之类的程序缺陷。有时,我的程序包管理器会告诉我该程序包需要该库的该版本,否则会发生一些冲突。

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


2
Windows 处理版本依赖性。大多数版本安装程序都会这样做。如果您还不熟悉它,请查看InnoSetup:jrsoftware.org/isinfo.php
paulsm4 2014年

4
可能值得注意的是,即使在您的示例中,管理依赖关系的也不是Linux本身-而是程序包管理器。
GalacticCowboy

3
Windows如何处理程序依赖性?糟糕的是,以我的经验。
rlms 2014年

Answers:


29

没有。除非我们谈论的是.NET,否则它要求您根据编译器安装框架版本X。

其他一切都将引发错误。祝你好运missing dll xxxx.dll。虽然,大多数安装程序都会包含必需的库才能运行该软件。


6
因此,由每个程序的安装程序检查是否存在缺陷?因此,如果安装程序很烂,你可能无法在所有..使用程序
尼科

忘了说,不,您可以使用那么程序,但是您必须弄清楚它需要哪个DLL或框架。
Filipe YaBa Polido 2014年

9
@Filipe那么,您必须安装V C ++运行时的事实就是您讨厌.NET软件的原因?默认情况下,Windows还已经安装了.NET框架,因此,如果您定位到正确的版本,它将立即可用。而且,出于显而易见的原因,您必须下载并安装缺少的共享库的事实实际上并不限于任何特定的软件/语言/框架(在* nix中也可能有相同的“问题”)。
Voo

2
@FilipeYaBaPolido:因为VC ++ 2008运行时是针对C ++应用程序而不是.Net应用程序的,所以您的仇恨特别放错了位置。显然,.Net应用程序需要.Net框架,而C ++应用程序需要C ++框架(运行时),确实非常简单。现在,特定的软件包可能同时包含C ++和.Net部分,因此这两个部分不是唯一的。
MSalters 2014年

2
伙计们放松一下,我不讨厌.Net或VC ++。我什至在需要时使用.Net / C#进行编码,这是一个工具。但是我使用一些不同的工具,并看到了差异。对不起,如果我解释错了。
Filipe YaBa Polido 2014年

40

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

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


我只是想在可接受的答案上稍微扩展一下,因为它在细节上有点稀疏。菲利普的回答只字不提的策略是Windows实际上用于解决或减轻程序依赖性问题,像分量存储器(WinSxS文件)全局程序集缓存,微星系统等。但在另一方面,他是基本正确的感觉到开发人员有责任在应用程序中包含任何自定义库,并在提交安装事务之前检查是否存在依赖项。

Windows比Linux具有更少的模块化和优点。不利的一面是,Windows更加单一,这意味着相对较少的操作系统组件是可移动的或可选的,例如Linux。(尽管Windows对此正在逐步好转。)

但从正面看,这意味着开发人员可以对用户将在其计算机上已经拥有的库做出更多的假设。并且这些库的各种版本(一旦安装)将并排存储在组件存储中,这样您就不再需要App1咆哮需要crapDLL.dll,而App2则咆哮着需要同一版本的crapDLL.dll。时间等


谢谢瑞安。我知道我应该详细说明我的答案,但是由于英语不是我的主要语言,所以我仍然有一些表达自己的困难。
Filipe YaBa Polido 2014年

描述得好。但是,我要说的是,它在服务器端的模块化程度越来越高-核心/无GUI选项,基于角色和功能的设置。
EricB 2014年

我今天早上读了这篇文章,它使我想起了这篇文章。这是一个有趣的内容,尽管内容相切:blogs.msdn.com/b/oldnewthing/archive/2014/04/11/10516280.aspx
Ryan Ries

9

在Windows中,由软件作者决定为其库提供版本控制。Windows有一些功能可以帮助解决此问题。

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

对于.NET Framework应用程序,有全局程序集缓存,强名称程序集和核心清单。

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

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


6

其他答案正确地指出了程序包管理和操作系统是分开的想法,但是没有提及解决方案。

Windows上与apt-get或yum最相似的软件包管理系统是Chocolatey。它允许人们安装/卸载软件包(msi,exe,powershell脚本等),并且这些软件包可以包含有关其依赖项的信息,这些信息可以由Chocolatey自动解决。

该软件包通常包含指向二进制文件和脚本的链接,以管理安装过程。该软件包还可以包含二进制文件或任何其他必需的文件(相关性应放在单独的软件包中)。Chocolatey还可以使用外部程序包管理系统,例如Microsoft的Web平台安装程序,Ruby Gems,Python等。


绝对!有一些第三方软件包管理器也可以在Windows上运行。我唯一能提到的就是NuGet,它是针对Visual Studio中内置的应用程序开发人员的软件包/依赖项管理器。话虽如此,我相信问题更多的是在寻找操作系统如何处理软件包,而这些解决方案则更着重于用户如何处理软件包。
金鱼三明治

抱歉,我没有提供有关Chocolatey的某些信息。Chocolatey基于Nuget。Nuget和Nuspec只是“东西”的包和依赖关系的规范。对于像.Net这样的软件框架(ruby,node等),依赖项通常是软件组件(dll,exe,js等)。这些都是应用程序使用的所有组件。
AllenSanborn

在Chocolatey的情况下,程序包是整个应用程序或应用程序依赖项(应用程序框架,例如java,.net,ruby)。Nuget程序包包含将管理应用程序安装的PowerShell脚本(也可以选择安装程序),并且Nuspec文件描述了该应用程序以及它具有哪些依赖关系,例如Powershell依赖于.Net。还有Boxstarter,它通过描述机器的配置及其所依赖的内容来将重点放在更高的级别。很整洁的东西。Boxstarter进入了人们使用Chef或Puppet的领域。
AllenSanborn

0

据我了解,Windows处理的唯一依赖项是Microsoft特定的库。例如,如果您在Windows中安装了诸如Blender之类的开源程序,它将在其各自独立的dll文件中包含libavcodec和ffmpeg库,并且如果您随后安装说OpenShot,它将安装其自己的libavcodec位于其自己的目录中,并且它们可以是完全不同的版本。卸载软件以清理遗留的垃圾时,这可能是一场噩梦,并且带有库冗余的磁盘空间也会占用更多空间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.