在 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>
我需要 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>