2017-12-27 349 views
0

我有一个在Visual Studio 2017中创建的C#XAML UWP项目,我有一些资源需要转换并部署到AppX包中。但是,我无法直接将其转换资产部署到AppXPackagePayload中。如何将目标中生成的内容部署到带有MSBuild的UWP应用程序中的AppX包中

我已经在RawData文件夹中用香草C#XAML应用程序和几个文本文件创建了一个简化的测试用例。我希望将文本文件转换(现在已复制)并部署到我的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文件夹在我的项目文件夹中包含我的“转换”文本文件。但是,即使将应用程序部署为内容,但在部署应用程序时,文件夹中的文件也不会将其放到AppX文件夹中。目标中未生成的所有其他资产都已部署。看起来好像在目标中创建的内容项不会被添加到AppXPackagePayload中。

如果我添加以下目标公司的ItemGroup:

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

然后在数据文件夹中的项目将部署到AppX中。但是,我觉得只需将我的项目添加到目标中的内容就足以实现部署。难道我做错了什么?

谢谢!

+0

您是否尝试重新加载项目? –

+0

有很多次!实际上,在我上面概述的测试案例中,我直接编辑了csproj文件,因此Visual Studio每次进行编辑时都会强制重新加载解决方案。我也尝试重新启动VS. –

+0

从Nico的评论开始,值得澄清的是,如果代码位于外部的props文件中而不是直接在csproj中,则必须关闭并重新加载整个解决方案以查看VS中的任何更改。卸载并重新加载解决方案中的特定项目是不够的。 –

回答

1

内容项目的处理在编译之前发生的,所以你应该

BeforeTargets="AssignTargetPaths"

这应该做的伎俩取代

BeforeTargets="Compile"

+0

是的,那工作!事后看来,我应该意识到它只是在错误的时间运行。谢谢! –

+0

为了防止某人有用,我将示例项目放在Github上:[https://github.com/jccaulfield/MSBuildTest](https://github.com/jccaulfield/MSBuildTest) –

0

我现在有一个工作解决方案,它可以避免目标生成的内容项以及明确的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> 

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

+0

这个答案实际上只是一种解决方法,可以避免这个问题,并可能对其他类似问题有帮助。我仍然希望有人能够帮助解决潜在的问题,即为什么从目标发出的我的内容项目未被部署。 –

相关问题