在 MSBuild 中获取 UWP Package.appxmanifest 版本

Get UWP Package.appxmanifest version in MSBuild

我需要 Package.appxmanifest 版本 MSBuild.Target。 我做的是:

<Target Name="Zip">
<ItemGroup>
    <BinDirectoryFiles Include="...\AppPackages\My-App_$(Version)\**\*.*" />
</ItemGroup>
<Zip Files="@(BinDirectoryFiles)" WorkingDirectory="...\AppPackages\My-App_$(Version)" 
ZipFileName="...\Zip\My-App_$(Version).zip" />

(我缩短了路径和名称)

所以这是我压缩应用程序包以将其上传到 HockeyApp 的目标。 (如果我用版本号硬编码完整的文件名,则 zip 目标正在工作。)但是要获得正确的应用程序包和 zip 文件的正确名称,我需要在 Package.appxmanifest 中设置的版本。但我不知道如何在 .csproj 文件中的 MSBuild.Target 中获取它。

Package.appxmanifest 只是一个 xml 文件,因此您可以创建自定义 MSBuild 任务来读取它,或者使用 MSBuild 扩展包来获取值。

以下 MSBuild 文件包含自定义 GetPackageVersion,它将从当前文件夹读取 Package.appxmanifest 并输出版本:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="Build">
  <GetPackageVersion Filename="Package.appxmanifest">
    <Output PropertyName="PackageVersion" TaskParameter="PackageVersion" />
  </GetPackageVersion>

  <Message Text="PackageVersion: $(PackageVersion)" />
</Target>

<UsingTask TaskName="GetPackageVersion" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <FileName ParameterType="System.String" Required="true" />
    <PackageVersion ParameterType="System.String" Output="true" />
  </ParameterGroup>
  <Task>
    <Reference Include="System.Xml" />
    <Reference Include="System.Xml.Linq" />
    <Using Namespace="System.IO" />
    <Using Namespace="System.Xml.Linq" />
    <Code Type="Fragment" Language="cs"><![CDATA[
      var doc = XDocument.Load(FileName);
      var defaultNamespace = doc.Root.GetDefaultNamespace();
      PackageVersion = doc.Root.Element(defaultNamespace.GetName("Identity")).Attribute("Version").Value;
]]></Code>
  </Task>
</UsingTask>

</Project>