如何使用 MSBuild 将目标中生成的内容部署到 UWP 应用程序中的 AppX 包

How to deploy Content generated in a Target to AppX package in a UWP app with MSBuild

我在 Visual Studio 2017 年创建了一个 C# XAML UWP 项目,我有一些资产要转换并已部署到 AppX 包。但是,我无法在不直接将它们添加到 AppXPackagePayload 的情况下部署我的转换资产。

我创建了一个简化的测试用例,其中包含香草 C# XAML 应用程序和 RawData 文件夹中的几个文本文件。我希望将文本文件转换(暂时复制)并部署到我的 AppX 中的 Data 文件夹。

我在导入 Xaml.CSharp.targets 之前将以下内容添加到我的 csproj(我添加 ConvertedData 项目类型只是为了调试):

<ItemGroup>
    <RawData Include="RawData\**\*.*" />
</ItemGroup>
<Target Name="ConvertData" BeforeTargets="Compile" Inputs="@(RawData)" Outputs="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)">
  <ItemGroup>
    <ConvertedData Include="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
    <Content Include="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
  </ItemGroup>
  <Message Importance="high" Text="Creating Data: @(RawData) -> Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
  <Copy SourceFiles="%(RawData.Identity)" DestinationFiles="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
</Target>
<Target Name="DisplayContent" AfterTargets="ConvertData" BeforeTargets="Compile">
  <Message Importance="high" Text="RawData: @(RawData)" />
  <Message Importance="high" Text="ConvertedData: @(ConvertedData)" />
  <Message Importance="high" Text="Content: @(Content)" />
</Target>

构建时的日志输出是这样的:

1>  Creating Data: RawData\Hello.txt -> Data\Hello.txt
1>  Creating Data: RawData\World.txt -> Data\World.txt
1>  RawData: RawData\Hello.txt;RawData\World.txt
1>  ConvertedData: Data\Hello.txt;Data\World.txt
1>  Content: Properties\Default.rd.xml;Assets\LockScreenLogo.scale-200.png;Assets\SplashScreen.scale-200.png;Assets\Square150x150Logo.scale-200.png;Assets\Square44x44Logo.scale-200.png;Assets\Square44x44Logo.targetsize-24_altform-unplated.png;Assets\StoreLogo.png;Assets\Wide310x150Logo.scale-200.png;Data\Hello.txt;Data\World.txt

符合预期。我现在在我的项目文件夹中有一个 Data 文件夹,其中包含我的 "converted" 文本文件。但是,Data 文件夹中的文件在部署应用程序时永远不会进入 AppX 文件夹,即使它们被列为内容。未在 Target 中生成的所有其他资产都会部署。似乎在 Target 中创建的内容项没有添加到 AppXPackagePayload。

如果我将以下内容添加到目标的项目组中:

<AppxPackagePayload Include="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)">
  <TargetPath>Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)</TargetPath>
</AppxPackagePayload>

然后 Data 文件夹中的项目将部署到 AppX。但是,我觉得只需将我的项目添加到目标中的内容就足以部署它们。我做错了什么吗?

谢谢!

我现在有一个有效的解决方案,它避免了 Target 生成的内容项,以及明确的 AppXPackagePayload。之所以可行,是因为我的 RawDataData 文件之间存在一对一映射,因此我可以将所有内容项放在目标之外。它没有回答为什么目标生成的内容项目没有部署(如果有人知道,我仍然想知道为什么会这样),但它确实以一种干净的方式解决了我的问题,因此可能对其他人有用:

<ItemGroup>
    <RawData Include="RawData\**\*.*">
      <Visible>True</Visible>
    </RawData>
</ItemGroup>
<ItemGroup>
    <Content Include="@(RawData-> 'Data\%(RecursiveDir)%(Filename)%(Extension)')">
      <Visible>True</Visible>
    </Content>
</ItemGroup>
<Target Name="ConvertData" BeforeTargets="Compile" Inputs="@(RawData)" Outputs="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)">
  <Copy SourceFiles="%(RawData.Identity)" DestinationFiles="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
</Target>

现在我的 Data 文件已在我的项目文件夹中创建,并已正确部署到 AppX 文件夹。

内容项的处理发生在编译之前,因此您应该替换

BeforeTargets="Compile"

BeforeTargets="AssignTargetPaths"

这应该可以解决问题。