Tôi đã đưa ra giải pháp hoạt động gần giống như thuộc tính AssemblyVersion cũ với dấu sao (*) - AssemblyVersion ("1.0. ") *
Giá trị cho AssemblyVersion và AssemblyFileVersion nằm trong tệp .csproj của dự án MSBuild (không phải trong AssemblyInfo.cs ) dưới dạng thuộc tính FileVersion (tạo AssemblyFileVersionAttribute ) và AssemblyVersion (tạo AssemblyVersionAttribute ). Trong quy trình MSBuild, chúng tôi sử dụng tác vụ MSBuild tùy chỉnh của mình để tạo số phiên bản và sau đó chúng tôi ghi đè các giá trị của các thuộc tính FileVersion và AssemblyVersion này bằng các giá trị mới từ tác vụ.
Vì vậy, trước tiên, chúng tôi tạo tác vụ MSBuild tùy chỉnh 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();
}
}
Nhiệm vụ lớp kế thừa từ Microsoft.Build.Utilities.Task lớp từ Microsoft.Build.Utilities.Core gói NuGet. Nó có thuộc tính BaseVersion (tùy chọn) trên đầu vào và trả về phiên bản đã tạo trong thuộc tính đầu ra Phiên bản. Logic để lấy số phiên bản cũng giống như lập phiên bản tự động .NET (Số bản dựng là số ngày kể từ ngày 1/1/2000 và Bản sửa đổi là nửa giây kể từ nửa đêm).
Để xây dựng tác vụ MSBuild này, chúng tôi sử dụng kiểu dự án thư viện lớp .NET Standard 1.3 với lớp này.
.csproj tệp có thể trông giống như sau:
<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>
Dự án nhiệm vụ này cũng có sẵn trong GitHub holajan / DC.Build.Tasks của tôi
Bây giờ chúng ta thiết lập MSBuild để sử dụng tác vụ này và đặt thuộc tính FileVersion và AssemblyVersion . Trong tệp .csproj, nó trông giống như sau:
<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>
Những điều quan trọng ở đây:
- Đã đề cập đến usingTask nhập tác vụ GetCurrentBuildVersion từ DC.Build.Tasks.dll . Nó giả định rằng tệp dll này nằm trên thư mục mẹ từ tệp .csproj của bạn.
- Mục tiêu BeforeBuildActionsProject1 của chúng tôi gọi nhiệm vụ phải có tên duy nhất cho mỗi dự án trong trường hợp chúng tôi có nhiều dự án hơn trong giải pháp gọi tác vụ GetCurrentBuildVersion.
Ưu điểm của giải pháp này là nó hoạt động không chỉ từ các bản dựng trên máy chủ xây dựng, mà còn trong các bản dựng thủ công từ bản dựng dotnet hoặc Visual Studio.
/p:
cờ đếndotnet msbuild
trong tập lệnh xây dựng và thiết lập phiên bản, công ty, bản quyền ... tất cả những thứ tốt đó.