为什么Chocolatey不会将软件包安装到“C:\Program Files\”目录下?

14
根据Windows安装规则,程序应安装到C:\Program Files(64位程序/x86-64)或C:\Program Files (x86)(32位程序/x86),且将程序复制到包含供应商名称和程序名称的子子文件夹中。
但为什么Chocolatey不会将软件包安装到C:\Program Files\<Vendor>\<Program>\
 

10. 应用程序必须默认安装到正确的文件夹中
用户应该拥有在默认文件夹安装文件的一致且安全的体验,同时保持在所选位置安装应用程序的选项。还有必要在正确的位置存储应用程序数据,以便多人可以在同一台计算机上使用而不会破坏或覆盖对方的数据和设置。 Windows提供了特定的文件系统位置来存储程序和软件组件,共享应用程序数据以及特定于用户的应用程序数据

 

10.1 您的应用程序必须默认安装在Program Files文件夹中
对于%ProgramFiles%中的本机32位和64位应用程序,以及在x64上运行的32位应用程序的%ProgramFiles(x86)%。由于此文件夹配置的安全权限,永远不要在此位置存储用户数据或应用程序数据。

来源:Windows桌面应用程序的认证要求
版本:10(2015年7月29日)

对于<vendor>部分,没有一条铁规定。甚至没有一个安装的确切规则(尽管Windows的后续版本似乎强制执行了一些疯狂的东西)。唯一的“规则”是默认安装目录的建议使用环境programfiles变量(特别是如果不让用户选择安装位置)。一些程序(例如LearnKey和Asus Probe)打破了这个规则并硬编码了路径。就我个人而言,如果我不能将游戏安装在E:/Games/旁边的E:/Programs/中,我会非常生气。 - GitaarLAB
@GitaarLAB 实际上,微软有认证要求,例如规定默认安装应用程序的位置。这并不意味着您可以在安装程序GUI或通过参数更改目录,以选择另一个硬盘驱动器。很抱歉我找不到适用于Windows 8.x“桌面应用程序”的文档版本。我确信有一个规则是<Vendor><ApplicationName>。 - Paebbels
很好的问题补充!(你可能想添加Chocolatey软件包使用的目录结构,以供不知道该程序的人使用)。但是我仍然坚持我的评论(而不是答案):我电脑上安装的(超过500个)程序中约90%没有供应商部分(我通常不会干涉那一部分;我只验证它不是一个天真的硬编码非规范兼容的安装程序(实际上很少见))。你在问题中添加的关于认证要求的引号中的关键字是“默认”、“%ProgramFiles%”和“%ProgramFiles(x86)%”(这就是我所评论的)。 - GitaarLAB
但是如果“<Vendor>”的要求确实在认证要求中(从而通过一行简单的文本排除了绝大多数(遗留)应用程序),我不会感到惊讶。但是看起来你更关心Chocolatey情况下程序文件环境变量之后发生了什么。我也可以问一下,这对你有影响吗? - GitaarLAB
“包”和“应用程序”的区别 - 我认为已经强调过了,包不一定是本地安装的应用程序,它们只是指导这些应用程序。本地安装的应用程序很可能会做正确的事情,并最终出现在“程序文件”中。 - ferventcoder
1个回答

8
这取决于您使用的Chocolatey版本、其设置以及软件包本身
要开始,可以查看工具与应用程序以及Chocolatey的区别(请参见底部的https://github.com/chocolatey/chocolatey/wiki/ChocolateyFAQs)。
如果软件包不使用本地安装程序(即工具),则取决于软件包作者是否使用了未来版本中即将推出的bin_root概念。
例如,SysInternals现在会进入c:/sysinternals,除非您定义了$env:chocolatey_bin_root变量。代码中的概念也会发生变化,因为现在需要它成为系统驱动器的子文件夹,而我认为我们不会开发具有该限制的最终功能。
如果软件包尚未具备该概念,则可以随时要求软件包作者将其纳入其中。
如果软件包使用本机安装程序(即应用程序),则可以使用installArgs将参数传递给本机安装程序(请参见https://github.com/chocolatey/chocolatey/wiki/CommandsInstall),并告诉它要将应用程序安装到哪个目录。这确实需要您知道需要传递给本机安装程序的内容。如果您希望将应用程序安装在自定义目录中,则假定您已经是高级用户,因此预计您会知道如果进行静默安装,需要传递给安装程序什么内容。

略微改编自: https://groups.google.com/forum/#!msg/chocolatey/uucAz8GxebA/HEPAKp69d90J

另外,

注意:从0.9.8.24开始,Chocolatey的默认安装位置是 C:\ProgramData\Chocolatey

这减少了本地安装chocolatey的攻击面,并限制了谁可以更改目录。

来源: https://github.com/chocolatey/chocolatey/wiki/DefaultChocolateyInstallReasoning

个人经验表明,这个概念是一个极好的防御线(当正确配置、使用和理解时)。

PS:
正如您在答案中所添加的,从技术上讲,要求使用%ProgramFiles%%ProgramFiles(x86)%(适用情况下)环境变量。
例如,%ProgramFiles(x86)%也可以指向P:\Software\Programs\x86\(而不是C:\Program Files (x86)\)。
很明显,有很多传统软件(现在重新打包)从未在路径名中使用<vendor>部分。

希望这可以帮助您!


3
我觉得我找到了我的问题所在。我原本以为NuGet/Chocolatey包就像*.deb包一样,但实际上它只是自动下载和静默安装的包装器。因此,安装目录仍然由嵌入或下载的MSI安装程序设置,可以使用默认目录或用户定义目录。 - Paebbels
是的,完全正确(那就是我在回答中试图概述的内容(使用“重新打包”、“引用”和区别这个词)。很高兴我能帮上忙! - GitaarLAB
其中一些是。通常我们区分的标准是,如果底层软件出现在“程序和功能”中,则放置在“Program Files”文件夹中。如果该软件是以zip文件形式提供的工具,则实际上并未安装在计算机上,因此与Microsoft位置没有集成。 - ferventcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接