【问题标题】:Why doesn't Chocolatey install packages into `C:\Program Files\`?为什么 Chocolatey 不将软件包安装到 `C:\Program Files\` 中?
【发布时间】:2015-12-12 05:27:31
【问题描述】:

根据 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)%。由于为此文件夹配置了安全权限,用户数据或应用数据绝不能存储在此位置。

来源:Certification requirements for Windows desktop apps
版本:10(2015 年 7 月 29 日)

【问题讨论】:

  • <vendor> 部分没有刻板的规则。甚至根本没有真正的安装规则(尽管更高版本的 Windows 似乎确实执行了一些疯狂的事情)。唯一的“规则”是默认安装目录的建议使用环境程序文件变量(特别是如果不让用户选择安装位置)。 一些 程序(例如 LearnKey 的东西(讽刺地)和 Asus Probe)打破了这个规则并硬编码了路径。就我个人而言,如果我无法在 E:/Programs/ 旁边的 E:/Games/ 中安装我的游戏..
  • @GitaarLAB 实际上,有微软编写的认证要求,例如默认安装应用程序的位置。这并不意味着您可以更改安装程序 GUI 中的目录或通过参数选择另一个硬盘。抱歉,我找不到 Windows 8.x 之前的“桌面应用程序”的文档版本。我确定<Vendor>\<ApplicationName> 有一个规则。
  • 很好地补充了您的问题! (您可能想要添加 Chocolatey 包为不了解该程序的人使用的目录结构)。但我坚持我的评论(不回答):我的电脑上安装的(超过 500 个)程序中约有 90% 没有供应商部分(而且我通常不会搞砸与那部分;我只是验证它不是一个天真的硬编码不符合规范的安装程序(实际上很少见))。关于您添加到问题中的认证要求的引号中的关键字是“默认”和%ProgramFiles%%ProgramFiles(x86)%(这是我评论的内容)。
  • 但是如果<Vendor> 的书面“要求”确实在认证要求中,我不会感到惊讶(因此仅通过简单的一行文本就排除了绝大多数(旧版)应用程序).. 但您似乎对 Chocolatey 的 programfiles 环境变量之后发生的事情更感兴趣。我还可以问一下(如果是,那么为什么)这对您来说很重要吗?
  • “包”与“应用程序”的区别 - 我认为它已经被突出显示,但包不一定是本机安装的应用程序,它们只是指导那些。本地安装的应用程序可能会做正确的事情并最终出现在 Program Files 中。

标签: installation directory package chocolatey


【解决方案1】:

这取决于你的 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> 部分。

希望这会有所帮助!

【讨论】:

  • 我想我找到了我的错。我认为 NuGet/Chocolatey 包是 *.deb 包之类的包,但它只是用于自动下载和静默安装的包装器。所以安装目录还是由内嵌或下载的微星安装器设置的。哪个原因可以使用默认目录或用户定义的目录。
  • 是的,正是(这就是我试图在我的答案中概述的内容(使用重新包装这个词以及引号和区别))。很高兴我能帮上忙!
  • 其中一些是。我们通常会区分,如果底层软件出现在程序和功能中,它就会进入程序文件。如果该软件是一个以 zip 文件形式提供的工具,它实际上并没有安装在机器上,因此没有与 Microsoft 位置集成。
猜你喜欢
  • 2022-08-27
  • 2015-11-24
  • 2010-10-19
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
相关资源
最近更新 更多