Я придумав рішення, яке працювало майже так само, як і старий атрибут AssemblyVersion із зіркою (*) - AssemblyVersion ("1.0. ") *
Значення для AssemblyVersion і AssemblyFileVersion є у файлі .csproj проекту MSBuild (не в AssemblyInfo.cs ) як властивість FileVersion (генерує AssemblyFileVersionAttribute ) і AssemblyVersion (генерує AssemblyVersionAttribute ). У процесі MSBuild ми використовуємо нашу власну задачу MSBuild для генерації номерів версій, а потім переосмислюємо значення цих властивостей FileVersion і AssemblyVersion на нові значення з завдання.
Отже, спочатку ми створимо нашу власну MSBuild завдання GetCurrentBuildVersion :
public class GetCurrentBuildVersion : Task
{
[Output]
public string Version { get; set; }
public string BaseVersion { get; set; }
public override bool Execute()
{
var originalVersion = System.Version.Parse(this.BaseVersion ?? "1.0.0");
this.Version = GetCurrentBuildVersionString(originalVersion);
return true;
}
private static string GetCurrentBuildVersionString(Version baseVersion)
{
DateTime d = DateTime.Now;
return new Version(baseVersion.Major, baseVersion.Minor,
(DateTime.Today - new DateTime(2000, 1, 1)).Days,
((int)new TimeSpan(d.Hour, d.Minute, d.Second).TotalSeconds) / 2).ToString();
}
}
Клас завдань успадковується від Microsoft.Build.Utilities.Task клас з пакету Microsoft.Build.Utilities.Core NuGet. Він бере властивість BaseVersion (необов'язково) при введенні та повертає генеровану версію у вихідному властивості версії. Логіка отримання номерів версій така ж, як і автоматичне оновлення .NET (число збірки - це кількість днів, починаючи з 1/1/2000, а перегляд - півтори секунди з півночі).
Для побудови цього завдання MSBuild ми використовуємо тип проекту для бібліотеки класу .NET Standard 1.3 .
Файл .csproj може виглядати так:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
<AssemblyName>DC.Build.Tasks</AssemblyName>
<RootNamespace>DC.Build.Tasks</RootNamespace>
<PackageId>DC.Build.Tasks</PackageId>
<AssemblyTitle>DC.Build.Tasks</AssemblyTitle>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Build.Framework" Version="15.1.1012" />
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.1.1012" />
</ItemGroup>
</Project>
Цей проект завдання також доступний у моїх програмах GitHub holajan / DC.Build.Tasks
Тепер ми налаштовуємо MSBuild для використання цього завдання та встановлюємо властивості FileVersion та AssemblyVersion . У файлі .csproj це виглядає приблизно так:
<Project Sdk="Microsoft.NET.Sdk">
<UsingTask TaskName="GetCurrentBuildVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\DC.Build.Tasks.dll" />
<PropertyGroup>
...
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion>
</PropertyGroup>
...
<Target Name="BeforeBuildActionsProject1" BeforeTargets="BeforeBuild">
<GetCurrentBuildVersion BaseVersion="$(FileVersion)">
<Output TaskParameter="Version" PropertyName="FileVersion" />
</GetCurrentBuildVersion>
<PropertyGroup>
<AssemblyVersion>$(FileVersion)</AssemblyVersion>
</PropertyGroup>
</Target>
</Project>
Тут важливі речі:
- Згадано за допомогою використання імпорту завдань GetCurrentBuildVersion з DC.Build.Tasks.dll . Він передбачає, що цей dll-файл знаходиться в батьківському каталозі з вашого .csproj-файлу.
- Наша передBuildActionsProject1 Завдання, яка має завдання для викликів, повинна мати унікальну назву для кожного проекту, якщо у нас є більше проектів у рішенні, яке викликає завдання GetCurrentBuildVersion.
Перевага цього рішення полягає в тому, що воно працює не тільки з побудов на сервері збірки, але і в ручних побудовах з dotnet build або Visual Studio.
/p:
прапорdotnet msbuild
у своєму сценарії збирання та встановленій версії, компанії, авторських правах ... все це добре.