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

如何使用MSBuild在UWP应用程序中部署目标到AppX包中生成的内容,msbuild,uwp,appx,Msbuild,Uwp,Appx,我在Visual Studio 2017中创建了一个C#XAML UWP项目,我有一些资产要转换并部署到AppX包中。但是,如果不直接将转换后的资产添加到AppXPackagePayload中,我将无法部署这些资产 我用一个普通的C#XAML应用程序和RawData文件夹中的两个文本文件创建了一个简化的测试用例。我希望将文本文件转换(暂时复制)并部署到我的AppX中的数据文件夹中 在导入Xaml.CSharp.targets之前,我在csproj中添加了以下内容(我添加ConvertedData

我在Visual Studio 2017中创建了一个C#XAML UWP项目,我有一些资产要转换并部署到AppX包中。但是,如果不直接将转换后的资产添加到AppXPackagePayload中,我将无法部署这些资产

我用一个普通的C#XAML应用程序和RawData文件夹中的两个文本文件创建了一个简化的测试用例。我希望将文本文件转换(暂时复制)并部署到我的AppX中的数据文件夹中

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

这是意料之中的。现在,我的项目文件夹中有一个数据文件夹,其中包含我的“转换”文本文件。但是,在部署应用程序时,即使数据文件夹中的文件列为内容,它们也不会进入AppX文件夹。未在目标中生成的所有其他资产都会得到部署。似乎在目标中创建的内容项没有添加到AppXPackagePayload中

如果我将以下内容添加到目标的ItemGroup:

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

数据\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)
然后将数据文件夹中的项目部署到AppX。但是,我觉得只要将我的项目添加到目标中的内容就足以部署它们。我做错什么了吗


谢谢

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

<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>

真的
真的

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

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

BeforeTargets=“Compile”

BeforeTargets=“AssignTargetPaths”


这应该可以解决问题。

您尝试过重新加载项目吗?是的,多次!实际上,在我上面概述的测试用例中,我正在直接编辑csproj文件,因此每当我进行编辑时,VisualStudio都会强制重新加载解决方案。我也尝试过重新启动VS。根据Nico的评论,值得澄清的是,如果代码在外部props文件中,而不是直接在csproj中,您必须关闭并重新加载整个解决方案以查看VS中的任何更改。仅卸载和重新加载解决方案中的特定项目是不够的。此答案实际上只是一种解决方法,可以避免此问题,并可能对其他有类似问题的人有所帮助。我仍然希望有人能够帮助解决潜在的问题,也就是说,为什么我从目标发出的内容项没有得到部署。是的,这是有效的!事后看来,我应该意识到它只是在错误的时间运行。谢谢为了以防万一,我将我的示例项目放在Github上:
<AppxPackagePayload Include="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)">
  <TargetPath>Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)</TargetPath>
</AppxPackagePayload>
<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>