如何使用 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。之所以可行,是因为我的 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>
现在我的 Data 文件已在我的项目文件夹中创建,并已正确部署到 AppX 文件夹。
内容项的处理发生在编译之前,因此您应该替换
BeforeTargets="Compile"
和
BeforeTargets="AssignTargetPaths"
这应该可以解决问题。
我在 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。之所以可行,是因为我的 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>
现在我的 Data 文件已在我的项目文件夹中创建,并已正确部署到 AppX 文件夹。
内容项的处理发生在编译之前,因此您应该替换
BeforeTargets="Compile"
和
BeforeTargets="AssignTargetPaths"
这应该可以解决问题。