Получить минорную и мажорную версию из скрипта MSBUILD
Я использую Msbuild для компиляции и генерации.zip файлов и инсталляторов, и мне нужен номер версии моего сборочного файла.
Я использую этот код.
<Target Name="getversion">
<GetAssemblyIdentity AssemblyFiles="$(BuildDir)\myprogram.exe">
<Output TaskParameter="Assemblies" ItemName="fooAssemblyInfo"/>
</GetAssemblyIdentity>
<Message Text="Version = %(fooAssemblyInfo.Version)"/>
</Target>
Но это возвращает Version = 2.0.0.29110, мне нужна только младшая и основная версия.
Есть ли какой-нибудь способ прочитать информацию на buildmbyInfo.cs без специальной задачи?
3 ответа
Наконец я использовал этот код, который не требует дополнительных библиотек задач
<Target Name="getversion">
<GetAssemblyIdentity AssemblyFiles="$(BuildDir)\myfile.exe">
<Output TaskParameter="Assemblies" ItemName="myAssemblyInfo"/>
</GetAssemblyIdentity>
<PropertyGroup>
<Pattern>(\d+)\.(\d+)</Pattern>
<In>%(myAssemblyInfo.Version)</In>
<OutVersion>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</OutVersion>
</PropertyGroup>
</Target>
Это можно сделать с помощью функций свойств MSBuild, описанных здесь: https://msdn.microsoft.com/en-us/library/dd633440%28v=vs.120%29.aspx
<Target Name="getversion">
<GetAssemblyIdentity AssemblyFiles="$(BuildDir)\myprogram.exe">
<Output TaskParameter="Assemblies" ItemName="fooAssemblyInfo"/>
</GetAssemblyIdentity>
<Message Text="Version = $([System.Version]::Parse(%(fooAssemblyInfo.Version)).ToString(2))" Importance="high" />
</Target>
Выход:
Done executing task "GetAssemblyIdentity".
Task "Message"
Task Parameter:Text=Version = 12.0
Task Parameter:Importance=high
Version = 12.0
Done executing task "Message".
Если вы используете MsBuild 4.0, вы можете написать собственное встроенное пользовательское задание, чтобы сделать это.
<UsingTask
TaskName="GetVersionParts"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<AssemblyPath ParameterType="System.String" Required="true" />
<MajorVersion ParameterType="System.Int32" Output="true" />
<MinorVersion ParameterType="System.Int32" Output="true" />
<BuildVersion ParameterType="System.Int32" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.Diagnostics" />
<Code Type="Fragment" Language="cs">
<![CDATA[
Log.LogMessage("Getting version details of assembly at: " + this.AssemblyPath, MessageImportance.High);
Version v = Version.Parse(FileVersionInfo.GetVersionInfo(this.AssemblyPath).FileVersion);
this.MajorVersion = v.Major;
this.MinorVersion = v.Minor;
this.BuildVersion = v.Build;
]]>
</Code>
</Task>
</UsingTask>
а затем сослаться на встроенную задачу в другом месте вашего скрипта сборки...
<GetVersionParts AssemblyPath="$(OutputDirAbsolute)/MyAssembly.dll">
<Output TaskParameter="MajorVersion" PropertyName="MajorVersionNumber" />
<Output TaskParameter="MinorVersion" PropertyName="MinorVersionNumber" />
<Output TaskParameter="BuildVersion" PropertyName="BuildVersionNumber" />
</GetVersionParts>
Используя встроенную задачу, вы можете легко получить доступ к каждой части номера сборки сборки. например, $(MajorVersionNumber)