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

How do I create a related set from individual MSIXes?

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

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

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

MSIXes 旨在旁加载(不通过 Microsoft Store 分发)并且它们都包含可执行文件。

我试过的

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

A related set cannot be updated because the updated set is invalid. All packages in the related set must be updated at the same time. (0x80003d17)

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

The optional package with centennial content OptionalPackageName_21.4.0.0_x86__0rk1t7bybtkaw is not in a related set and it is required to be in a related set specified by the centennial main package MainPackageName_0rk1t7bybtkaw.

我不知道“centennial content”或“centennial main package”是什么意思,在网上搜索也没有成功。

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

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

MakeAppx : warning: Ignoring footprint file "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 Expansion Pack 尚不支持可选包或相关集。我希望我们可以对 WiX 生成的 MSIX 进行一些调整(例如编辑 AppxManifest.xml 文件中的 XML),这将给我们想要的东西。

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

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

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

如果您在阅读本主题之前已经阅读了其他 MSIX-related 主题,那么很容易忽略创建捆绑包的必要性,因为捆绑包在其他地方的文档中被作为将组合在一起的一种方式针对不同体系结构的包的单个单元多个版本。如果这不是您关心的问题,那么您可能认为您可以忽略它们。好吧,它们可以用于此目的 - 但如果您想创建相关集,也可以(确实必须)使用它们。您可以拥有一个只有一个基本包的捆绑包,并且只适用于一个架构。

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