我需要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中获取它。
答案 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>