Как изменить номер версии сборки с помощью AssemblyInfoTask? - PullRequest
19 голосов
/ 30 декабря 2010

Я пытаюсь автоматизировать процесс установки версии для всех библиотек DLL, потратив некоторое время, я узнал задачу AssemblyInfo, с помощью которой она, скорее всего, может быть достигнута.

Итак, я установил его, а именно версию 1.0.51130.0 .

После установки я вручную добавил тег Import (путем выгрузки каждого проекта) AssemblyInfoTask в .cspoj файлах (решение имеет более 35 файлов proj).

<Import Project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets"/>

Далее я изменил файл Microsoft.VersionNUmber.Target, который будет установлен по пути: C:\Program Files\MSBuild\Microsoft\AssemblyInfoTask, и изменил следующий раздел:

<!-- Properties for controlling the Assembly Version -->
<PropertyGroup>
    <AssemblyMajorVersion>4</AssemblyMajorVersion>
    <AssemblyMinorVersion>0</AssemblyMinorVersion>
    <AssemblyBuildNumber></AssemblyBuildNumber>
    <AssemblyRevision></AssemblyRevision>
    <AssemblyBuildNumberType>DateString</AssemblyBuildNumberType>
    <AssemblyBuildNumberFormat>01MMdd</AssemblyBuildNumberFormat>
    <AssemblyRevisionType>AutoIncrement</AssemblyRevisionType>
    <AssemblyRevisionFormat>00</AssemblyRevisionFormat>
</PropertyGroup>

<!-- Properties for controlling the Assembly File Version -->  
<PropertyGroup>
    <AssemblyFileMajorVersion>4</AssemblyFileMajorVersion>
    <AssemblyFileMinorVersion>0</AssemblyFileMinorVersion>
    <AssemblyFileBuildNumber></AssemblyFileBuildNumber>
    <AssemblyFileRevision></AssemblyFileRevision>
    <AssemblyFileBuildNumberType>DateString</AssemblyFileBuildNumberType>
    <AssemblyFileBuildNumberFormat>01MMdd</AssemblyFileBuildNumberFormat>
    <AssemblyFileRevisionType>AutoIncrement</AssemblyFileRevisionType>
    <AssemblyFileRevisionFormat>00</AssemblyFileRevisionFormat>
</PropertyGroup>

Далее я установил версию файла assemblyInfo.cs на 1.0.0.0 в каждом проекте. Наконец я сохранил и закрыл его, заново открыл решение и собрал. Работает как чемпион!

Теперь нужно настроить версию на 4.0.1053.1, где 10 - это указатель части года, который равен 2010, а 53 обозначает номер недели, наконец 1 обозначает номер редакции.

Как этого добиться с помощью задачи AssemblyInfo? Я сталкивался с несколькими сообщениями, что новая версия AssemblyInfo Task доступна в Build Extension Pack.

Я установил MSBuild Extension Pack Декабрь 2010 и его версия MSBuild Extension Pack 4.0.2.0 Установщик

Ответы [ 4 ]

15 голосов
/ 11 февраля 2011

Во-первых .. используйте globalassemblyinfo.cs, который связан с каждым проектом.Добавьте его как связанный файл в каждый проект.Это означает, что вы обновляете один файл, а не 30+ файлов ассемблерной информации ... тогда:

используйте MSBuild.Community.Tasks ....

Затем вызовите

<AssemblyInfo CodeLanguage="CS"
         OutputFile="$(VersionFile)"
         AssemblyCompany="Company"
         AssemblyProduct="Product"
         AssemblyCopyright="Copyright © Company 2011"
         ComVisible="false"
         AssemblyVersion="$(BUILD_NUMBER)"
         AssemblyFileVersion="$(BUILD_NUMBER)" />

Если у вас есть что-то вроде:

<Import Project=".\tasks\MSBuild.Community.Tasks.Targets"/>
13 голосов
/ 03 января 2013

Я делаю это в Jenkins, имея сборку пакета, параметризованную с использованием типа параметра List Subversion Tags. Тег Subversion должен соответствовать формату номера версии (major.minor.revision.build), например, tags/2.0.0.1. Имя тега затем присваивается параметру Jenkins, например, $VERSION становится 2.0.0.1

Я использую задачу WriteLinesToFile msbuild, чтобы записать атрибут сборки во второй файл рядом с PropertyInfo.cs с именем VersionInfo.cs. Как отмечено в управлении исходным кодом, он просто содержит номер версии по умолчанию:

// Do not change this. The version is set on package builds only by setting the AsmVersion MSBuild property
[assembly: System.Reflection.AssemblyVersion("0.0.0.0")] 

Сборка пакета на сервере сборки передается в версии через параметр AsmVersion:

/p:AsmVersion=$VERSION

Файл .csproj изменен, чтобы иметь цель BeforeBuild (Visual Studio создает закомментированную для вас):

<Target Name="BeforeBuild">
    <WriteLinesToFile 
        Condition=" '$(AsmVersion)' != '' " File="Properties\VersionInfo.cs" 
        Overwrite="True"
        Lines="[assembly: System.Reflection.AssemblyVersion(&quot;$(AsmVersion)&quot;)] // Generated by build" />   
</Target>

При сборке в Visual Studio или без передачи в AsmVersion ваша сборка будет иметь версию по умолчанию 0.0.0.0. При сборке в сборке пакета вы получите желаемый номер сборки.

3 голосов
/ 21 декабря 2017

Обновление для файлов .csproj стиля .NET Core: Если вы столкнулись с этим вопросом после перехода на новый формат .csproj, используемый в .NET Core, вы можете просто установить Свойство версии (не нужно беспокоиться о задачах MSBuild).

1 голос
/ 05 сентября 2017

Как я наконец получил это, чтобы работать MSBuild версии 12 (VS 2013).

  1. Использовал Nuget для получения пакета MSBuildTasks Community
  2. Отредактировал мой файл .csproj и добавил путь к импорту пакета:
<Import Project="..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.targets" Condition="Exists('..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.target')"/>
  1. Разобрался с Regex, чтобы изменить только номер ревизии в файле AssemblyInfo.cs:
(?<=AssemblyFileVersion\("[0-9]\.[0-9]\.[0-9]\.)(\*)

, который не совместим с XML, поэтому должен быть изменен на:

(?&#60;=AssemblyFileVersion\(&#34;&#91;0-9]\.&#91;0-9]\.&#91;0-9]\.)(\*)
  1. Раскомментировал раздел <Target Name="BeforeBuild"> и добавил следующее:
<Target Name="BeforeBuild">
    <FileUpdate Files="properties\AssemblyInfo.cs"
                Regex="(?&#60;=AssemblyFileVersion\(&#34;&#91;0-9]\.&#91;0-9]\.&#91;0-9]\.)(\*)"
                ReplacementText="$(Revision)" />
</Target>
  1. При запуске MSBuild в командную строку добавлялось свойство «Редакция», например
msbuild.exe myProject.csproj /t:Build /p:Configuration=Release;Revision=12345
...