如何将目标中生成的内容部署到带有MSBuild的UWP应用程序中的AppX包中
我有一个在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中。但是,我觉得只需将我的项目添加到目标中的内容就足以实现部署。难道我做错了什么?
谢谢!
内容项目的处理在编译之前发生的,所以你应该
BeforeTargets="AssignTargetPaths"
这应该做的伎俩取代
BeforeTargets="Compile"
。
是的,那工作!事后看来,我应该意识到它只是在错误的时间运行。谢谢! –
为了防止某人有用,我将示例项目放在Github上:[https://github.com/jccaulfield/MSBuildTest](https://github.com/jccaulfield/MSBuildTest) –
我现在有一个工作解决方案,它可以避免目标生成的内容项以及明确的AppXPackagePayload。这是有效的,因为我在我的RawData和Data文件之间有一对一映射,所以我可以将所有内容项目放在目标之外。它并没有回答为什么目标生成的内容项目没有被部署(我仍然想知道为什么有人知道这就是这种情况),但它确实以一种干净的方式解决了我的问题,所以可能对其他人有用:现在
<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中的文件夹。
这个答案实际上只是一种解决方法,可以避免这个问题,并可能对其他类似问题有帮助。我仍然希望有人能够帮助解决潜在的问题,即为什么从目标发出的我的内容项目未被部署。 –
您是否尝试重新加载项目? –
有很多次!实际上,在我上面概述的测试案例中,我直接编辑了csproj文件,因此Visual Studio每次进行编辑时都会强制重新加载解决方案。我也尝试重新启动VS. –
从Nico的评论开始,值得澄清的是,如果代码位于外部的props文件中而不是直接在csproj中,则必须关闭并重新加载整个解决方案以查看VS中的任何更改。卸载并重新加载解决方案中的特定项目是不够的。 –