【发布时间】:2017-12-27 19:52:42
【问题描述】:
我有一个在 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 文件夹,其中包含我的“转换后的”文本文件。但是,在部署应用程序时,Data 文件夹中的文件永远不会进入 AppX 文件夹,即使它们被列为内容。未在 Target 中生成的所有其他资产都会被部署。似乎在 Target 中创建的内容项没有添加到 AppXPackagePayload。
如果我将以下内容添加到目标的 ItemGroup:
<AppxPackagePayload Include="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)">
<TargetPath>Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)</TargetPath>
</AppxPackagePayload>
然后将 Data 文件夹中的项目部署到 AppX。但是,我觉得只需将我的项目添加到 Target 中的 Content 就足以部署它们。我做错了吗?
谢谢!
【问题讨论】:
-
您是否尝试过重新加载项目?
-
是的,很多次!实际上,在我上面概述的测试用例中,我直接编辑 csproj 文件,因此每次进行编辑时,Visual Studio 都会强制重新加载解决方案。我也试过重启VS。
-
从 Nico 的评论开始,值得澄清的是,如果代码在外部 props 文件中而不是直接在 csproj 中,则必须关闭并重新加载整个解决方案才能查看 VS 中的任何更改。卸载和重新加载解决方案中的特定项目是不够的。