提问人:Shrimperator 提问时间:11/15/2023 更新时间:11/18/2023 访问量:46
从生成的 MSIX 包中排除文件夹
Exclude folders from generated MSIX package
问:
我正在使用 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 依赖项文件夹,这几乎使我的包大小翻了一番。
我尝试过:
- 在 MyProject.Package.wapproj MSBUILD 文件中,我尝试从构建中删除内容,如下所示:
<Content Remove="SoundEffects\MySoundEffect.mp3" />
<Content Remove="SoundEffects\*.*" />
我也尝试了删除属性的其他路径,但没有运气。我不确定我的方法是错误的,还是我误解了如何在这里构建正确的路径。
- 我通过 Visual Studio 创建了一个 MSIX 包布局文件。它似乎包括这里的文件:
<GeneratedFiles/>
<GeneratedResources/>
在那下面,我尝试了这个(相关 learn.microsoft.com 页面):
<Files>
<File ExcludePath="SoundEffects\MySoundEffect.mp3"/>
<File ExcludePath="SoundEffects\*.*"/>
</Files>
不幸的是,两者都没有做任何事情,并且生成的包仍然包含两次所有内容。我希望保持包布局相同,除了排除包根目录中的SoundEffects文件夹。我错过了什么?
答:
您面临的问题可能是由于打包项目在打包过程中将 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 项目的结构或内容进行任何更改。
评论