在MSBuild中获取UWP Package.appxmanifest版本

时间:2017-03-22 10:58:26

标签: msbuild uwp appxmanifest

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

<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目标正常工作。)但是为了获得正确的apppackage和zip文件的正确名称,我需要在Package.appxmanifest中设置的版本。但我不知道如何在.csproj文件中的MSBuild.Target中获取它。

1 个答案:

答案 0 :(得分:2)

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>