从生成的 MSIX 包中排除文件夹

Exclude folders from generated MSIX package

提问人:Shrimperator 提问时间:11/15/2023 更新时间:11/18/2023 访问量:46

问:

赏金将在 5 天后到期。这个问题的答案有资格获得 +50 声望赏金。Shrimperator希望引起人们对这个问题的更多关注
我正在寻找一种方法来保持当前生成的 MSIX 包完好无损,但从包根目录中排除特定文件夹。如果解决方案需要相对路径,而不是包根目录,我需要知道如何构造路径 - MS 文档对此非常模糊。
(可选)如果您能解释为什么 MSIX 打包项目可能会首先将我的内容添加到包中两次,我将不胜感激。

我正在使用 Visual Studio 中的 Windows 应用程序打包项目将 WPF 应用程序打包为 MSIX 包,以便在 Microsoft 的应用商店中分发。

现在,我的应用程序运行良好。唯一的麻烦是,生成的 .msix 包似乎包含我所有的“内容”资源两次:一次用于我正在打包的项目,一次用于打包项目。


我的项目结构如下:

答:我最初的 WPF 项目,名为“MyProject”

  • 这包含一个名为 SoundEffects 的文件夹,其中包含许多 mp3 文件。在 VS 中,我已将“生成操作”设置为“内容”,并将“复制到输出目录”设置为“如果较新则复制”。我需要将这些文件单独包含在 .exe 中,以便用户能够替换这些文件。

B:我的打包项目,包含 appxmanifest 并将 MyProject 设置为项目引用。


如果我用 7Zip 打开它,生成的 .msix 包的结构是这样的:

  • (文件夹)我的项目

    • (文件夹)SoundEffects <---不错
    • ...其他项目二进制文件
  • (文件夹)SoundEffects <---不好

  • AppXManifest.xml

  • 资源.pri

  • [Content_Types].xml


如您所见,我获得了两次SoundEffects文件夹。所有资源都会发生这种情况,包括 LibVLC 添加的 80mb 依赖项文件夹,这几乎使我的包大小翻了一番。


我尝试过:

  1. MyProject.Package.wapproj MSBUILD 文件中,我尝试从构建中删除内容,如下所示:
<Content Remove="SoundEffects\MySoundEffect.mp3" />
<Content Remove="SoundEffects\*.*" />

我也尝试了删除属性的其他路径,但没有运气。我不确定我的方法是错误的,还是我误解了如何在这里构建正确的路径。

  1. 我通过 Visual Studio 创建了一个 MSIX 包布局文件。它似乎包括这里的文件:
<GeneratedFiles/>
<GeneratedResources/>

在那下面,我尝试了这个(相关 learn.microsoft.com 页面):

<Files>
    <File ExcludePath="SoundEffects\MySoundEffect.mp3"/>
    <File ExcludePath="SoundEffects\*.*"/>
</Files>

不幸的是,两者都没有做任何事情,并且生成的包仍然包含两次所有内容。我希望保持包布局相同,除了排除包根目录中的SoundEffects文件夹。我错过了什么?

WPF MSIX APPX

评论


答:

-1赞 SkyBest I 11/25/2023 #1

您面临的问题可能是由于打包项目在打包过程中将 MyProject 项目中的文件作为内容包含在内,从而导致生成的 .msix 包中出现重复条目。

若要防止出现这种情况,可以通过添加从包中删除重复文件的生成后事件来修改打包项目的 .wapproj 文件。这是如何做到的:

在 Visual Studio 中,右键单击“解决方案资源管理器”中的打包项目,然后选择“卸载项目”。 右键单击已卸载的项目,然后选择“编辑 MyProject.Package.wapproj”。 找到引用 MyProject 项目的“Project”元素,并添加一个名为“TargetPath”的 Child 元素,其值为“$(MSBuildThisFileDirectory)AppxLayout\MyProject”。 保存并关闭 .wapproj 文件。 右键单击打包项目,然后选择“重新加载项目”。 打开打包项目的属性,然后导航到“生成事件”选项卡。 在“生成后事件命令行”字段中,添加以下命令以从包中删除重复的文件:

del "$(TargetDir)AppxLayout\MyProject\SoundEffects\*.*" /s /q

生成包后,此命令将删除 MyProject 文件夹中 SoundEffects 目录的内容。/s 开关告诉 del 删除所有子目录中的所有文件,而 /q 开关告诉它这样做而不要求确认。

保存项目属性并重新生成解决方案。 验证包是否不再包含 MyProject\SoundEffects 下的重复内容。 这应该可以解决问题,而无需对 MyProject 项目的结构或内容进行任何更改。

评论

0赞 Shrimperator 11/26/2023
我在弄清楚在哪里设置 TargetPath 时遇到了一些麻烦。它似乎做任何事情的唯一地方是作为 MyProject 的 ProjectReference 的属性,在这种情况下,它确实在 MyProject.Package/AppxLayout 中生成了一个子文件夹,但是,它只包含一个名为“MyProject”的文件,没有扩展名。也是一个相当小的文件,只有 26kb。因此,删除目标也找不到任何内容。另外:我确实弄清楚了软件包在打包之前从哪里获取重复文件,但是在构建后删除它们并没有做任何事情 - 软件包仍然包含它们。