GÜNCELLEME:
Bu soruyu yanıtladığımdan beri işler değişti. Microsoft.NET.SdkBazı şartlar yerine getirildiği takdirde, iyi Nuget paket meta verilerine olduğu kadar hem montaj bilgilendirme versiyon karma taahhüt şimdi eklemek için destek içerir (bir sdk tarzı projesini kullanıyor olması gerekir anlamına gelir):
<SourceRevisionId>Mülkiyet tanımlanmalıdır. Bu, aşağıdaki gibi bir hedef eklenerek yapılabilir:
<Target Name="InitializeSourceControlInformation" BeforeTargets="AddSourceRevisionToInformationalVersion">
<Exec
Command="git describe --long --always --dirty --exclude=* --abbrev=8"
ConsoleToMSBuild="True"
IgnoreExitCode="False"
>
<Output PropertyName="SourceRevisionId" TaskParameter="ConsoleOutput"/>
</Exec>
</Target>
Bu hedef SourceRevisionId, kısaltılmış (8 karakter) karma olarak ayarlanacak bir komutu yürütür . BeforeTargets, bunun derleme bilgi sürümü oluşturulmadan önce çalıştırılmasına neden olur.
Hashet paketi meta verilerine dahil etmek için <RepositoryUrl>, ayrıca tanımlanmalıdır.
<SourceControlInformationFeatureSupported>özellik olmalıdır true, bu, nuget paketi görevinin SourceRevisionId'yi de almasına neden olur.
Bu yeni teknik daha temiz ve en tutarlı olduğu için, insanları MSBuildGitHash paketini kullanmaktan uzaklaştırırdım.
ORİJİNAL:
Bunu sizin için halledecek, projenize dahil edebileceğiniz basit bir nuget paketi oluşturdum: https://www.nuget.org/packages/MSBuildGitHash/
Bu nuget paketi "saf" bir MSBuild çözümü uygular. Bir nuget paketine bağlı kalmayı tercih etmezseniz, bu Hedefleri csproj dosyanıza kopyalayabilirsiniz ve git karmasını özel bir derleme özniteliği olarak içermelidir:
<Target Name="GetGitHash" BeforeTargets="WriteGitHash" Condition="'$(BuildHash)' == ''">
<PropertyGroup>
<!-- temp file for the git version (lives in "obj" folder)-->
<VerFile>$(IntermediateOutputPath)gitver</VerFile>
</PropertyGroup>
<!-- write the hash to the temp file.-->
<Exec Command="git -C $(ProjectDir) describe --long --always --dirty > $(VerFile)" />
<!-- read the version into the GitVersion itemGroup-->
<ReadLinesFromFile File="$(VerFile)">
<Output TaskParameter="Lines" ItemName="GitVersion" />
</ReadLinesFromFile>
<!-- Set the BuildHash property to contain the GitVersion, if it wasn't already set.-->
<PropertyGroup>
<BuildHash>@(GitVersion)</BuildHash>
</PropertyGroup>
</Target>
<Target Name="WriteGitHash" BeforeTargets="CoreCompile">
<!-- names the obj/.../CustomAssemblyInfo.cs file -->
<PropertyGroup>
<CustomAssemblyInfoFile>$(IntermediateOutputPath)CustomAssemblyInfo.cs</CustomAssemblyInfoFile>
</PropertyGroup>
<!-- includes the CustomAssemblyInfo for compilation into your project -->
<ItemGroup>
<Compile Include="$(CustomAssemblyInfoFile)" />
</ItemGroup>
<!-- defines the AssemblyMetadata attribute that will be written -->
<ItemGroup>
<AssemblyAttributes Include="AssemblyMetadata">
<_Parameter1>GitHash</_Parameter1>
<_Parameter2>$(BuildHash)</_Parameter2>
</AssemblyAttributes>
</ItemGroup>
<!-- writes the attribute to the customAssemblyInfo file -->
<WriteCodeFragment Language="C#" OutputFile="$(CustomAssemblyInfoFile)" AssemblyAttributes="@(AssemblyAttributes)" />
</Target>
Burada iki hedef var. İlki, "GetGitHash", git karmasını BuildHash adlı bir MSBuild özelliğine yükler, bunu yalnızca BuildHash önceden tanımlanmamışsa yapar. Bu, isterseniz komut satırından MSBuild'e iletmenize olanak tanır. Bunu MSBuild'e şu şekilde iletebilirsiniz:
MSBuild.exe myproj.csproj /p:BuildHash=MYHASHVAL
İkinci hedef olan "WriteGitHash", karma değerini "CustomAssemblyInfo.cs" adlı geçici "obj" klasöründeki bir dosyaya yazar. Bu dosya şuna benzeyen bir satır içerecektir:
[assembly: AssemblyMetadata("GitHash", "MYHASHVAL")]
Bu CustomAssemblyInfo.cs dosyası derlemenizde derleneceğinden AssemblyMetadata, çalışma zamanında aramak için yansımayı kullanabilirsiniz . Aşağıdaki kod, AssemblyInfosınıf aynı derlemeye dahil edildiğinde bunun nasıl yapılabileceğini gösterir .
using System.Linq;
using System.Reflection;
public static class AssemblyInfo
{
/// <summary> Gets the git hash value from the assembly
/// or null if it cannot be found. </summary>
public static string GetGitHash()
{
var asm = typeof(AssemblyInfo).Assembly;
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
return attrs.FirstOrDefault(a => a.Key == "GitHash")?.Value;
}
}
Bu tasarımın bazı faydaları, proje klasörünüzdeki herhangi bir dosyaya dokunmaması, tüm değiştirilmiş dosyaların "obj" klasörü altında olmasıdır. Projeniz ayrıca Visual Studio içinden veya komut satırından aynı şekilde derlenir. Ayrıca projeniz için kolayca özelleştirilebilir ve csproj dosyanızla birlikte kaynak tarafından kontrol edilir.