Eu vim com uma solução que funcionava quase da mesma forma que o antigo atributo AssemblyVersion com estrela (*) - AssemblyVersion ("1.0. ") *
Os valores para AssemblyVersion e AssemblyFileVersion estão no arquivo .csproj do projeto MSBuild (não em AssemblyInfo.cs ) como propriedade FileVersion (gera AssemblyFileVersionAttribute ) e AssemblyVersion (gera AssemblyVersionAttribute ). No processo MSBuild, usamos nossa tarefa MSBuild personalizada para gerar números de versão e, em seguida, substituímos os valores dessas propriedades FileVersion e AssemblyVersion por novos valores da tarefa.
Portanto, primeiro criamos nossa tarefa MSBuild personalizada 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();
}
}
Tarefa classe herde de Microsoft.Build.Utilities.Task classe de Microsoft.Build.Utilities.Core pacote NuGet. Ele recebe a propriedade BaseVersion (opcional) na entrada e retorna a versão gerada na propriedade de saída da Versão. A lógica para obter os números de versão é a mesma do controle de versão automático do .NET (o número da compilação é a contagem de dias desde 01/01/2000 e a revisão é de meio segundo desde a meia-noite).
Para construir esta tarefa MSBuild, usamos o tipo de projeto de biblioteca de classes .NET Standard 1.3 com esta classe.
O arquivo .csproj pode ter a seguinte aparência:
<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>
Este projeto de tarefa também está disponível em meu GitHub holajan / DC.Build.Tasks
Agora configuramos o MSBuild para usar esta tarefa e definir FileVersion propriedades e AssemblyVersion . No arquivo .csproj, tem a seguinte aparência:
<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>
Coisas importantes aqui:
- UsingTask mencionado importa a tarefa GetCurrentBuildVersion de DC.Build.Tasks.dll . Ele presume que esse arquivo dll está localizado no diretório pai do arquivo .csproj.
- Nosso BeforeBuildActionsProject1 Target que chama a tarefa deve ter um nome exclusivo por projeto, caso tenhamos mais projetos na solução que chama a tarefa GetCurrentBuildVersion.
A vantagem dessa solução é que ela funciona não apenas em compilações no servidor de compilação, mas também em compilações manuais de compilação dotnet ou Visual Studio.
/p:
bandeira paradotnet msbuild
em seu script de construção e definir versão, empresa, direitos autorais ... todas essas coisas boas.