如何针对特定构建配置从 .xap 中排除文件

How to exclude files from .xap for specific build configurations

我在 WP8 项目的开发过程中使用 .json 文件作为数据源。 这些文件的构建操作设置为内容。
当我构建生产版本时,出于安全原因,我想从生成的 .xap 文件中排除这些文件(因为它就像所有网络服务的蓝图)。

Pre- 和 post-build 事件没有用,因为 .xap 文件是在构建期间生成的。由于 xap 在技术上是一个 zip,我可以使用 post 构建事件和自定义工具来提取、删除和重新打包它,但我想避免这种情况。

我还可以将 Condition 参数应用于 .csproj 文件中的每个 json 文件:

<Content Condition="'$(Configuration)' == 'Debug'" Include="DesignData\authentication\testservice.json">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

但是由于有 +100 个文件,这似乎也是一个次优的解决方案,无需创建另一个自定义工具来完成这项工作并保持 csproj 文件的更新。

终于发现可以在xap打包前执行一个target,但是删除目录后打包失败:

<PropertyGroup>
  <FilesToXapDependsOn>$(FilesToXapDependsOn);AfterFilesToXapDependsOn</FilesToXapDependsOn>
</PropertyGroup>
<Target Name="AfterFilesToXapDependsOn">
  <RemoveDir Directories="$(TargetDir)/DesignData" />
</Target>

您需要从 MSBuild 创建 .xap 文件时使用的 Item 集合中删除您希望排除的文件。如果您只是删除该目录,您将收到错误消息,因为 MSBuild 仍希望文件在那里。

至少在 Microsoft.WindowsPhone.Common.targets 的 8.1 版本中,您可能想要的目标似乎需要在 AssignTargetPathsDependsOn:

<PropertyGroup>
  <AssignTargetPathsDependsOn>$(AssignTargetPathsDependsOn);RemoveJsonFiles</AssignTargetPathsDependsOn>
</PropertyGroup>
<Target Name="RemoveJsonFiles">
  <ItemGroup>
    <Content Condition=" '$(Configuration)' == 'Release' " Remove="**\*.json" />
  </ItemGroup>
</Target>

如果这个扩展点不适合您,您可能需要寻找其他更好的扩展点来添加您的目标。

如您所见,要尝试的另一件事是名为 Content 的项目的 Remove 属性。此 属性 仅适用于 Target 个元素中的 ItemGroup 个元素中的项目。