Как изменить номер версии сборки с помощью AssemblyInfoTask?
Я пытаюсь автоматизировать процесс установки Версии для всех 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
Пожалуйста, помогите.
Ответы
Ответ 1
Сначала... используйте globalassemblyinfo.cs, который связан с каждым проектом.
Добавьте его как связанный файл в каждый проект.
Это означает, что вы обновляете один файл, а не 30 файлов assemblyinfo... затем:
использовать 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"/>
Ответ 2
Я делаю это в Jenkins, имея сборку пакетов, которая параметризуется с использованием типа параметра Tag Subversion Tag. Тег 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("$(AsmVersion)")] // Generated by build" />
</Target>
При создании в Visual Studio или без передачи в AsmVersion ваша сборка будет иметь версию по умолчанию 0.0.0.0. При построении сборки пакета вы получите желаемый номер сборки.
Ответ 3
Как я, наконец, получил это для работы MSBuild версии 12 (VS 2013).
- Используемый Nuget для получения пакета сообщества MSBuildTasks
- Отредактировал мой .csproj файл и добавил путь к импорту пакета:
<Import Project="..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.targets" Condition="Exists('..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.target')"/>
- Извлеките Regex, чтобы изменить только номер версии в файле AssemblyInfo.cs:
(?<=AssemblyFileVersion\("[0-9]\.[0-9]\.[0-9]\.)(\*)
который не совместим с XML, поэтому его необходимо изменить на:
(?<=AssemblyFileVersion\("[0-9]\.[0-9]\.[0-9]\.)(\*)
- Раскомментировал раздел
<Target Name="BeforeBuild">
и добавил следующее:
<Target Name="BeforeBuild">
<FileUpdate Files="properties\AssemblyInfo.cs"
Regex="(?<=AssemblyFileVersion\("[0-9]\.[0-9]\.[0-9]\.)(\*)"
ReplacementText="$(Revision)" />
</Target>
- При запуске MSBuild добавлено свойство "Revision" в командную строку, например.
msbuild.exe myProject.csproj /t:Build /p:Configuration=Release;Revision=12345
Ответ 4
Обновление для файлов .csproj для .NET.NET.. Если вы столкнулись с этим вопросом после перехода на новый формат .csproj, используемый .NET Core, вы можете просто установите свойство Version (не нужно беспокоиться о задачах MSBuild).