AKTUALIZACJA:
Rzeczy uległy zmianie, odkąd pierwotnie odpowiedziałem na to pytanie. Microsoft.NET.Sdk(Czyli należy używać projekt SDK-style) zawiera teraz wsparcie dla dodanie popełnić hash zarówno wersję montaż informacyjną, jak również metadanych pakietu Nuget, jeśli spełnione są pewne warunki:
<SourceRevisionId>Właściwość musi być określona. Można to zrobić, dodając taki cel:
<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>
Ten cel wykonuje polecenie, które ustawi SourceRevisionId jako skrócony (8-znakowy) skrót. BeforeTargets powoduje, że zostanie to uruchomione przed utworzeniem wersji informacyjnej zestawu.
Aby uwzględnić skrót w metadanych pakietu NuGet, <RepositoryUrl>należy również zdefiniować plik.
<SourceControlInformationFeatureSupported>musi być true, powoduje to, że zadanie pakietu NuGet pobiera również SourceRvisionId.
Odciągnąłbym ludzi od korzystania z pakietu MSBuildGitHash, ponieważ ta nowa technika jest czystsza i najbardziej spójna.
ORYGINALNY:
Stworzyłem prosty pakiet nuget, który możesz dołączyć do swojego projektu, który zajmie się tym za Ciebie: https://www.nuget.org/packages/MSBuildGitHash/
Ten pakiet NuGet implementuje „czyste” rozwiązanie MSBuild. Jeśli wolisz nie polegać na pakiecie nuget, możesz po prostu skopiować te elementy docelowe do pliku csproj i powinny one zawierać skrót git jako atrybut zestawu niestandardowego:
<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>
Są tu dwa cele. Pierwsza z nich, „GetGitHash”, ładuje skrót git do właściwości programu MSBuild o nazwie BuildHash, robi to tylko wtedy, gdy BuildHash nie jest jeszcze zdefiniowany. Dzięki temu możesz przekazać go do programu MSBuild w wierszu polecenia, jeśli wolisz. Możesz przekazać to do MSBuild w następujący sposób:
MSBuild.exe myproj.csproj /p:BuildHash=MYHASHVAL
Drugi cel, „WriteGitHash”, zapisze wartość skrótu do pliku w tymczasowym folderze „obj” o nazwie „CustomAssemblyInfo.cs”. Ten plik będzie zawierał linię, która wygląda następująco:
[assembly: AssemblyMetadata("GitHash", "MYHASHVAL")]
Ten plik CustomAssemblyInfo.cs zostanie skompilowany do zestawu, dzięki czemu można użyć odbicia, aby wyszukać plik AssemblyMetadataw czasie wykonywania. Poniższy kod pokazuje, jak można to zrobić, gdy AssemblyInfoklasa jest uwzględniona w tym samym zestawie.
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;
}
}
Niektóre zalety tego projektu to to, że nie zmienia on żadnych plików w folderze projektu, wszystkie zmutowane pliki znajdują się w folderze „obj”. Twój projekt będzie również kompilowany identycznie z poziomu programu Visual Studio lub z wiersza polecenia. Można go również łatwo dostosować do projektu i będzie on kontrolowany wraz z plikiem csproj.