Yıldız (*) - AssemblyVersion ("1.0. ") * İle eski AssemblyVersion özniteliğiyle neredeyse aynı şekilde çalışan bir çözüm buldum
Değerleri AssemblyVersion ve AssemblyFileVersion MSBuild proje olduğunu .Csproj (değil de dosyaya AssemblyInfo.cs mülkiyet gibi) DosyaSürümü (üretir AssemblyFileVersionAttribute ) ve AssemblyVersion (üretir AssemblyVersionAttribute ). MSBuild sürecinde, sürüm numaralarını oluşturmak için özel MSBuild görevimizi kullanıyoruz ve ardından bu FileVersion ve AssemblyVersion değerlerini geçersiz kılıyoruz. özelliklerinin yeni değerlerle .
Bu yüzden önce özel MSBuild görevimizi GetCurrentBuildVersion oluşturuyoruz :
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();
}
}
Dan Görev sınıf devralır Microsoft.Build.Utilities.Task gelen sınıfına Microsoft.Build.Utilities.Core NuGet paketinden . Girişte BaseVersion özelliğini (isteğe bağlı) alır ve Version çıktı özelliğinde üretilen sürümü döndürür. Sürüm numaralarını alma mantığı, .NET otomatik sürüm oluşturma ile aynıdır (Derleme numarası, 1/1 / 2000'den itibaren gün sayısıdır ve Revizyon, gece yarısından itibaren yarım saniyedir).
Bu MSBuild görevini oluşturmak için , bu sınıfla birlikte .NET Standard 1.3 sınıf kitaplığı proje türünü kullanıyoruz.
.csproj dosyası şöyle görünebilir:
<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>
Bu görev projesi ayrıca GitHub holajan / DC.Build.Tasks'ımda da mevcuttur.
Şimdi MSBuild'i bu görevi kullanacak ve FileVersion ve AssemblyVersion özelliklerini ayarlayacak şekilde kuruyoruz . .Csproj dosyasında şöyle görünür:
<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>
Burada önemli şeyler:
- UsingTask'dan bahsedildi GetCurrentBuildVersion görevini DC.Build.Tasks.dll'den içe aktarır . Bu dll dosyasının .csproj dosyanızdaki üst dizinde bulunduğunu varsayar.
- GetCurrentBuildVersion görevini çağıran çözümde daha fazla projemiz olması durumunda, görevi çağıran BeforeBuildActionsProject1 Hedefimiz proje başına benzersiz bir ada sahip olmalıdır.
Bu çözümün avantajı, yalnızca derleme sunucusundaki derlemelerde değil, aynı zamanda dotnet derlemesinden veya Visual Studio'dan manuel derlemelerde de çalışmasıdır .
/p:
bayrağıdotnet msbuild
... Yapınızın yazısı ve set sürümü, şirket, telif tüm bu iyi şeyler.