我正在使用托管引导程序应用程序构建WiX软件包安装程序。最近,我添加了一个新的MsiPackage
安装每台机器,但只有在用户选择通过复选框时安装。用户可以稍后从“程序和功能”修改安装以安装此软件包。这是捆绑包中唯一的每台机器包。其余的是每个用户。允许没有提升权限的安装对我们来说至关重要,这就是每台机器包是可选的原因。在修改期间请求提升权限是可以的。
最初,我配置了这样的新包:
<MsiPackage Id="optional_package"
Cache="yes" Compressed="yes" Visible="no"
DisplayInternalUI="no"
SourceFile="..\Resources\OptionalPackage.msi" />
此配置的问题在于,如果在第一次安装捆绑软件时未安装软件包,则不会对其进行高速缓存(Cache="yes"
仅在安装软件包时才会缓存)。如果用户随后尝试修改安装以安装此程序包,则该操作将失败,因为刻录无法找到OptionalPackage.msi的源。我能够通过请求始终缓存包来解决此问题:
<MsiPackage Id="optional_package"
Cache="always" Compressed="yes" Visible="no"
DisplayInternalUI="no"
SourceFile="..\Resources\OptionalPackage.msi" />
这解决了第一个问题,但产生了一个新问题。由于OptionalPackage.msi安装在每台计算机上,因此刻录尝试将其缓存在C:\ProgramData\Package Cache
(每台计算机缓存)而不是%LocalAppData%\Package Cache
(每用户缓存)中。这有两个问题:
C:\ProgramData\Package Cache
是每台计算机的位置,需要提升权限。由于我们始终缓存此新包,因此用户始终需要提升权限才能安装。C:\ProgramData\Package Cache
。以管理员身份运行是一种解决方法。我怀疑#2是一个刻录错误,因为它应该要求获得访问每台计算机缓存的权限。我的问题是,我可以缓存到自定义位置吗?是否可以强制刻录将每台计算机程序包缓存到每个用户文件夹?我没有看到任何配置选项。
我试图在这里提供一些上下文,以防有更好的方法来做到这一点。我的总体目标是允许用户通过首次安装时跳过的修改来安装软件包。如果有更好的方法,请通知我。
答案 0 :(得分:0)
我解决了这个问题,所以我想我会在这里发布一个答案供其他人查找。我最终通过按需下载选项包而不是缓存它来解决缓存问题。只需设置Compressed="no"
并设置DownloadUrl
。
<MsiPackage Id="optional_package"
Cache="yes" Compressed="no" Visible="no"
DisplayInternalUI="no"
SourceFile="..\Resources\OptionalPackage.msi"
DownloadUrl="https://example.com/download/OptionalPackage.msi" />
当需要安装软件包时,WiX会自动下载它。请注意,SourceFile
定义的文件和DownloadUrl
定义的文件必须完全匹配。 WiX对SourceFile
进行哈希处理并将其存储在安装程序中。下载后它会在DownloadUrl
处对文件进行哈希处理,并且只有在哈希值匹配时才会安装它。
这个解决方案并不理想,因为它需要实习连接,但没有其他方法可以满足我们的要求。我们的主要问题是这个.msi是一个每机器包,我们的安装程序是按用户运行的。我们与FireGiant进行了磋商,并了解了上述其他一些问题的答案: