Получить младшую и основную версии из скрипта MSBUILD

Я использую Msbuild для компиляции и создания ZIP-файлов и установщиков, и мне нужен номер версии моего файла assembyInfo.

Я использую этот код.

<Target Name="getversion">
    <GetAssemblyIdentity AssemblyFiles="$(BuildDir)\myprogram.exe">
        <Output TaskParameter="Assemblies" ItemName="fooAssemblyInfo"/>
    </GetAssemblyIdentity>
    <Message Text="Version = %(fooAssemblyInfo.Version)"/>
</Target>

Но это возвращает версию = 2.0.0.29110, мне нужны только младшая и основная версии.

Есть ли способ прочитать информацию asembyInfo.cs без пользовательской задачи?


person Carlos Garces    schedule 18.09.2013    source источник
comment
используйте встроенный код и сделайте его только двумя нужными вам номерами   -  person stijn    schedule 18.09.2013
comment
Хотите привести пример @stijn?   -  person Dav Evans    schedule 17.10.2013
comment
@DavEvans ответ, опубликованный Карлосом, делает именно это: он использует регулярное выражение С#, чтобы получить только первые два числа.   -  person stijn    schedule 17.10.2013


Ответы (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>
person Carlos Garces    schedule 19.09.2013
comment
Для тех, у кого возникли проблемы, как у меня, мне пришлось включить ссылки Microsoft.Build и Microsoft.Build.Framework, чтобы это работало, иначе это давало мне пустую строку. - person matth; 23.06.2015
comment
Как вы ссылаетесь на Microsoft.Build в wixproject? - person rolls; 18.09.2017
comment
Не работает для меня. Просто возвращает пустую строку. Невозможно добавить Microsoft.Build, поскольку мой проект предназначен для .NET Framework 2.0 - person Doctor Coder; 18.05.2018

Это можно сделать с помощью функций свойств 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".
person Sergei Zinovyev    schedule 29.09.2015
comment
Спасибо!! Спасибо!)) - person Alex from Jitbit; 22.12.2017
comment
Алекс, Пожалуйста :) - person Sergei Zinovyev; 20.06.2019

Если вы используете 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)

person Dav Evans    schedule 30.10.2013