如何从单个 MSIX 创建相关集?

Posted

技术标签:

【中文标题】如何从单个 MSIX 创建相关集?【英文标题】:How do I create a related set from individual MSIXes? 【发布时间】:2021-12-03 16:51:55 【问题描述】:

让我们假设我创建了两个 MSIX 包并且它们彼此独立。但是,我想让它们成为一个“相关集”;我希望其中一个成为我的“主包”,另一个成为与主包一起安装的“可选包”。我使用 MakeAppx.exe 解压了我机器上的两个 MSIX 包,我正在查看文件系统中的两个包,特别是 AppxManifest.xml 文件。

我知道对于可选包,MainPackageDependency 元素(来自 XML 命名空间 http://schemas.microsoft.com/appx/manifest/uap/windows10/3)可能会添加到 AppxManifest.xml 中的“Dependencies”元素中。但是,我相信为了让这两个包形成一个“相关集”,我还需要在主包的AppxManifest.xml中添加一些东西。我不知道我需要在那里添加什么。

这个问题的重点是我需要对主包进行哪些更改。完成这些更改后,仍需要重新打包 MSIX 并对其进行签名。你可能想当然地认为我知道如何完成这些步骤。

MSIX 旨在侧面加载(不通过 Microsoft Store 分发),它们都包含可执行文件。

我尝试过的

我已尝试仅修改相关集中应作为“可选包”的包。这样做的结果是,当我尝试安装这两个包时,主包安装成功,但在尝试安装可选包时,显示以下错误消息:

无法更新相关集,因为更新的集无效。相关集中的所有包必须同时更新。 (0x80003d17)

Windows 错误日志中出现以下错误:

百年纪念内容OptionalPackageName_21.4.0.0_x86__0rk1t7bybtkaw的可选包不在相关集中,需要在百年纪念主包MainPackageName_0rk1t7bybtkaw指定的相关集中。

我不知道“百年内容”或“百年主包”这两个词是什么意思,在线搜索也没有成功。

我尝试将PackageDependency 元素添加到主包的AppxManifest.xml 文件中的Dependencies 元素,并将Optional 属性(来自XML 命名空间http://schemas.microsoft.com/appx/manifest/uap/windows10/6)设置为“true”。这产生了与上述相同的结果。据我了解,这不是正确的方法,因为PackageDependency 元素用于声明所谓的“框架依赖项”,这是一种不同的依赖项。

我发现了一个 Microsoft 文档页面,该页面建议名为“AppxBundleManifest.xml”的文件可能是有关可选包信息的载体。因此,我尝试将名为“AppxBundleManifest.xml”的文件添加到主包中,其内容模仿了 Visual Studio 在尝试使用从 GitHub 下载的示例项目时为我创建的同名文件。但是,MakeAppx.exe 在运行时不会打包此文件;它打印以下消息:

MakeAppx:警告:忽略足迹文件“AppxMetadata\AppxBundleManifest.xml”。

我不知道术语“足迹文件”是什么意思,也不知道为什么该文件被忽略。

我尝试浏览Microsoft's documentation of the AppxManifest.xml file schema,但我没有发现那里有任何帮助。

我已尝试安装付费软件产品“Advanced Installer”的试用版,因为它支持此功能,而且我认为我可以从它产生的 MSIXes 中使用。然而,虽然我可以使用这个软件产品创建我的可选包,但我不知道如何创建主包。供应商有在线文档,但据我所知,自编写该文档以来,他们已经更改了应用程序 GUI 的相关部分,我无法弄清楚相关选项在我下载的版本中的位置。具体来说,this page 似乎暗示“构建”小部件(列在“包定义”类别下)应该包含一个“可选包”选项卡;实际上,那里没有“可选包”选项卡。

我尝试使用 Microsoft 在 GitHub 上提供的 a sample project。但是,虽然我设法让它“构建”,但我没有成功让它创建实际的 MSIX 文件。它确实创建了 AppxManifest.xml 文件,但这些文件中没有任何内容显然是我自己项目中文件中缺少的元素。

为什么我不使用 Visual Studio 创建包?

我们想使用 WiX 来创建 MSIX。不幸的是,WiX 扩展包还不支持可选包或相关集。我希望我们可以对 WiX 生成的 MSIX 进行一些调整(例如,在 AppxManifest.xml 文件中编辑 XML),从而满足我们的需求。

【问题讨论】:

【参考方案1】:

这里的问题是我错误地认为相关的集合可以以单个包的形式创建,使用 MakeAppx 编译。您实际上要做的是分两步使用 MakeAppx:

    使用 MakeAppx 创建包。 再次使用 MakeAppx 从您已经创建的包中创建一个 bundle。 (使用“映射文件”在标题 [ExternalPackages] 下指定一个或多个可选包)

如果您在字里行间阅读,可以从 Microsoft 文档中收集到这一点,但在我看到的任何地方都没有明确解释。

如果您在阅读本文之前已经阅读过其他与 MSIX 相关的主题,则很容易忽略创建捆绑包的必要性,因为捆绑包的动机是在其他地方的文档中作为将多个版本组合成一个单元的一种方式针对不同架构的软件包。如果这不是您关心的问题,那么您可能认为您可以无视它们。好吧,它们可以用于那个目的——但如果你想创建相关的集合,它们也可以(确实必须)使用。您可以拥有一个仅包含一个基本包且仅用于单一架构的捆绑包。

还有一个问题:创建 msixbundle 需要最低 Windows SDK 版本(我认为是 10.0.18362.0)。

【讨论】:

以上是关于如何从单个 MSIX 创建相关集?的主要内容,如果未能解决你的问题,请参考以下文章

数据库迁移:单个创建脚本与更改集

如何从 WPF MSIX 应用程序(桌面桥)更改 Windows 10 颜色设置?

与单个请求相关的创建/关闭啥:ChannelFactory 或创建的 Channel?

在 ffmpeg 中从单个图像创建特定持续时间的视频

自定义 Visual Studio MSIX 打包项目输出

如何将值设置为jtable?