我如何从VS / msbuild中提取Git commit hash? [英] How can I extract Git commit hash from VS/msbuild?
问题描述
这个场景是:
我们希望将当前的git commit的哈希(Git repo的基础与 .sln
目录相同)作为生成版本号的一部分。要做到这一点,我们大概需要提取当前提交的散列并将其插入到版本号字符串中,然后我们将其作为参数传递给MSBuild。
所以问题是,如何我们可以从MSBuild或Visual Studio中获得这个吗?不能保证开发者将安装Git命令行,但他们至少会安装VS2015,并且已经内置了Git支持,所以你会认为有一些方法可以从中获得最新的Git commit的哈希值?如果您进入Visual Studio GUI并查看源代码管理部分,您可以看到散列。
是否有一些命令行工具与Visual Studio 2015或更高版本捆绑在一起这将返回当前的Git提交的散列?
您的要求不依赖于 git.exe
使这个变得复杂。
然而,如果你想使用Visual Studio使用的库LibGit2Sharp并进行Visual Studio集成,你可以像这样做一些疯狂的事情。
添加一个新的目标到你的项目文件。我假设你正在使用C#,所以在将它添加到你的csproj之后
< Import Project =$(MSBuildToolsPath)\Microsoft。 CSharp.targets/>
$ b
< PropertyGroup>
< CodeFile> $(MSBuildProjectDirectory)\HelloGit.cs< / CodeFile>
< CodeFileText> $([System.IO.File] :: ReadAllText($(CodeFile)))< / CodeFileText>
< CodeFileText> $([MSBuild] :: Unescape($(CodeFileText)))< / CodeFileText>
< / PropertyGroup>
< UsingTask TaskName =HelloGitTaskFactory =CodeTaskFactoryAssemblyFile =$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll>
< ParameterGroup>
< Sha1 ParameterType =System.StringRequired =FalseOutput =True/>
< Repository ParameterType =System.StringRequired =TrueOutput =False/>
< / ParameterGroup>
<任务>
< Reference Include =System.Xml,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089/>
<引用包含=C:\程序文件(x86)\ Microsoft Visual Studio 14.0 \ Common \ IDE \ CommonExtensions \ Microsoft \ TeamFoundation \ Team Explorer \LibGit2Sharp.dll />
< Using Namespace =System/>
< Using Namespace =System.IO/>
< Code Type =ClassLanguage =cs>
$(CodeFileText)
< / Code>
< /任务>
< / UsingTask>
<目标名称=RunTaskAfterTargets =BeforeBuild>
< HelloGit Repository =$(MSBuildProjectDirectory)>
< Output TaskParameter =Sha1PropertyName =CommitId/>
< / HelloGit>
< Warning Text =您的提交是:$(CommitId)/>
< / Target>
这样做是在当前项目目录中查找HelloGit.cs。它的内容看起来像这样...
你可以用一个内联代码任务来完成这个任务(例如嵌入的C#内部的XML),但是由于任务很长,我想要用VS编辑它作为一个单独的文件。
$ b
using System;
使用System.Collections.Generic;
使用System.Linq;
使用System.Reflection;
使用System.Runtime.CompilerServices;
使用System.Text;
使用LibGit2Sharp;
使用Microsoft.Build.Framework;
使用Microsoft.Build.Utilities;
命名空间GitIntrospection {
public class HelloGit:Task {
public override bool Execute(){
AppDomain.CurrentDomain.AssemblyResolve + =(sender, args)=> {
if(args.Name.Contains(LibGit2Sharp)){
return Assembly.LoadFrom(C:\\ Program Files(x86)\\ Microsoft Visual Studio 14.0 \ \Common7\\IDE\\CommonExtensions\\\ Microsoft\\TeamFoundation\\Team Explorer\\LibGit2Sharp.dll);
}
返回null;
};
GetCommit();
return!Log.HasLoggedErrors;
}
// [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private void GetCommit(){
Repository repository = new Repository(Repository);
this.Sha1 = repository.Commits.First()。Id.Sha;
}
[输出]
公共字符串Sha1 {get;组; }
[必需的]
public string Repository {get;组; }
}
}
现在,当您构建项目时,被提取并记录为警告。这适用于Visual Studio和MS Build内部。
适用于命令行
在Visual Studio中工作
< img src =https://i.stack.imgur.com/jV2F3.pngalt =在Visual Studio中工作>