让我们假设我已经创建了两个MSIX包,并且它们彼此独立。然而,我想把它们变成一个";相关集合";;我想让其中一个成为我的";主包装";另一个是";可选包装";安装在主程序包旁边。我已经使用MakeAppx.exe在我的机器上解包了两个MSIX包,我正在查看文件系统中的两个包,特别是AppxManifest.xml文件。
我知道对于可选包,MainPackageDependency
元素(来自XML命名空间http://schemas.microsoft.com/appx/manifest/uap/windows10/3
)可以添加到"依赖项";元素。然而,我相信为了使这两个包形成一个";相关集合";,我还需要在主包的AppxManifest.xml中添加一些内容。我不知道我需要补充什么。
这个问题的重点是我需要对主程序包进行哪些更改。一旦做出了这些更改,就需要重新打包MSIX并对其进行签名。你可能认为我知道如何完成这些步骤是理所当然的。
MSIX是侧加载的(不是通过Microsoft Store分发的),它们都包含可执行文件。
我尝试过的
我尝试只修改本应是";可选包装";在相关集合中。这样做的结果是,当我尝试安装两个包时,主包安装成功,但在尝试安装可选包时,会显示以下错误消息:
无法更新相关集,因为更新的集无效。必须同时更新相关集中的所有程序包。(0x80003d17)
以下错误出现在Windows错误日志中:
具有百年内容OptionalPackageName_21.4.0.0_x86__0rk1t7bybtkaw的可选程序包不在相关集合中,并且要求它位于由百年主程序包MainPackageName_0rk1t17bybtkawa指定的相关集合中。
我不知道术语";百年内容";或";百年主包装";刻薄,在网上搜索都没有成功。
我已经尝试将PackageDependency
元素添加到主包的AppxManifest.xml文件中的Dependencies
元素中,其中Optional
属性(来自xml命名空间http://schemas.microsoft.com/appx/manifest/uap/windows10/6
)设置为"0";真";。这产生了与上述相同的结果。我的理解是这不是正确的方法,因为CCD_;框架依赖性";,这是一种不同类型的依赖。
我发现了一个微软文档页面,它建议使用一个名为";AppxBundleManifest.xml";可能是用于获取可选包裹信息的车辆。因此,我尝试添加一个名为";AppxBundleManifest.xml";到主包,内容以Visual Studio在我尝试使用从GitHub下载的示例项目时为我创建的同名文件的内容为模型。但是,当MakeAppx.exe运行时,该文件不会被打包;它打印以下消息:
MakeAppx:警告:忽略封装外形文件"AppxMetadata\AppxBundleManifest.xml";。
我不知道术语";封装外形文件";表示,也不表示文件被忽略的原因。
我尝试过浏览微软的AppxManifest.xml文件模式文档,但没有发现任何有用的东西。
我已经尝试安装付费软件产品"的试用版;高级安装程序";,因为它拥有对这一功能的支持,我想我可能能够从它生产的MSIX中获得灵感。然而,虽然我可以使用这个软件产品创建我的可选包,但我不知道如何创建主包。供应商在网上有文档,但据我所知,自从编写文档以来,他们已经更改了应用程序GUI的相关部分,我不知道我下载的版本中的相关选项在哪里。具体地说,这一页似乎表明;构建";小部件(列在"包定义"类别下)应该包含一个";可选包装";选项卡;事实上;可选包装";选项卡。
我尝试过使用微软在GitHub上提供的一个示例项目。然而,当我设法把它变成";构建";,我还没有成功地让它创建实际的MSIX文件。它确实创建了AppxManifest.xml文件,但这些文件中没有任何明显是我自己项目中文件中缺少的元素。
为什么我不使用Visual Studio来创建包
我们希望使用WiX来创建MSIX。不幸的是,WiX扩展包还不支持可选软件包或相关套件。我希望我们可以对WiX生成的MSIX进行一些调整(例如,编辑AppxManifest.XML文件中的XML),以满足我们的需求。
这里的问题是,我错误地认为可以以单独包的形式创建相关集,并使用MakeAppx进行编译。您实际要做的是分两步使用MakeAppx:
- 使用MakeAppx创建包
- 再次使用MakeAppx从您已经创建的包中创建捆绑包。(使用在标题
[ExternalPackages]
下指定一个或多个可选包的"映射文件")
如果你仔细阅读,你可以从微软文档中了解到这一点,但我看到的任何地方都没有明确解释。
如果您在阅读本主题之前已经阅读了其他与MSIX相关的主题,那么很容易忽略创建捆绑包的必要性,因为捆绑包在其他地方的文档中是一种将针对不同体系结构的多个版本的包组合成一个单元的方式。如果这不是你关心的问题,那么你可能会相信你可以无视它们。好吧,它们可以用于这个目的,但如果你想创建相关的集,它们也可以(实际上必须)使用。您可以有一个只有一个基本包的捆绑包,并且只能用于单个体系结构。
还有一个问题:创建msixbundle需要最低版本的Windows SDK(我认为是10.0.18362.0)。