2017-05-05 1 views
0

시나리오는 다음과 같습니다.VS/msbuild에서 Git 커밋 해시를 어떻게 추출 할 수 있습니까?

개발자는 컴퓨터에서 PowerShell 스크립트를 실행하여 MSBuild를 통해 OctopusDeploy에 다양한 Nuget 패키지를 게시합니다. 생성 된 버전 번호의 현재 git 커밋의 해시 (Git repo의 기본은 .sln 디렉토리와 동일 함)를 만들고 싶습니다. 이렇게하려면 현재 커밋의 해시를 추출하여 버전 번호 문자열에 연결해야합니다. 그런 다음 매개 변수로 MSBuild에 전달합니다.

MSBuild 또는 Visual Studio에서 어떻게 얻을 수 있습니까? 개발자가 힘내 명령 줄을 설치한다고 보장 할 수는 없지만 적어도 VS2015가 설치되어 있고 힘내 지원 기능이 내장되어 있으므로 최신 Git 커밋의 해시를 얻을 수있는 방법이 있다고 생각합니까? Visual Studio GUI에 들어가서 소스 컨트롤 섹션을 보면 해시를 볼 수 있습니다.

현재 Git 커밋의 해시를 반환하는 Visual Studio 2015 이상과 함께 번들로 제공되는 명령 줄 도구가 있습니까?

답변

4

귀하의 요구 사항은 git.exe에 의존하지 않아야합니다. 그러나 Visual Studio에서 사용하는 라이브러리 인 LibGit2Sharp를 사용하고 Visual Studio와의 통합을 원할 경우 이와 같은 미친 짓을 할 수 있습니다.

프로젝트 파일에 새 타겟을 추가하십시오. 나는 당신이 그렇게 이것이하는 일은 "HelloGit.cs"에 대한 현재 프로젝트 디렉토리를 보면입니다

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

<PropertyGroup> 
    <CodeFile>$(MSBuildProjectDirectory)\HelloGit.cs</CodeFile> 
    <CodeFileText>$([System.IO.File]::ReadAllText("$(CodeFile)"))</CodeFileText> 
    <CodeFileText>$([MSBuild]::Unescape("$(CodeFileText)"))</CodeFileText> 
    </PropertyGroup> 

    <UsingTask TaskName="HelloGit" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll"> 
    <ParameterGroup> 
     <Sha1 ParameterType="System.String" Required="False" Output="True" /> 
     <Repository ParameterType="System.String" Required="True" Output="False" /> 
    </ParameterGroup> 
    <Task> 
     <Reference Include="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
     <Reference Include="C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\LibGit2Sharp.dll" /> 
     <Using Namespace="System" /> 
     <Using Namespace="System.IO" /> 
     <Code Type="Class" Language="cs"> 
     $(CodeFileText) 
     </Code> 
    </Task> 
    </UsingTask> 

    <Target Name="RunTask" AfterTargets="BeforeBuild"> 

    <HelloGit Repository="$(MSBuildProjectDirectory)"> 
     <Output TaskParameter="Sha1" PropertyName="CommitId" /> 
    </HelloGit> 
    <Warning Text="Your commit is: $(CommitId)" /> 

    </Target> 

후 csproj에 추가 C#을 사용하는 가정하고 있습니다. 그 내용은 다음과 같습니다 ...

인라인 코드 작업 (예 : XML 내부의 C# 포함)으로 수행 할 수 있지만 작업이 상당히 길어서 VS 코드에서 별도의 파일로 편집하고 싶습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Runtime.CompilerServices; 
using System.Text; 
using LibGit2Sharp; 
using Microsoft.Build.Framework; 
using Microsoft.Build.Utilities; 


namespace 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"); 
       } 
       return 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; 
     } 

     [Output] 
     public string Sha1 { get; set; } 

     [Required] 
     public string Repository { get; set; } 
    } 
} 

이제 프로젝트를 빌드하면 최신 커밋이 추출되어 경고로 기록됩니다. 이것은 Visual Studio와 MS Build 내부에서 작동합니다. Works inside Visual Studio

결과도 git.exe에 동의하는 것 비주얼 스튜디오 내부의 명령 줄 Works on the command line

작품에

작품 ... 그 The results even seem to agree with git.exe... that's handy

대체 편리합니다 1 당신 git.exe과만 사용할 수 있습니다.작업!

대체 2 PowerShell을 사용하여 LibGit2Sharp 어셈블리를로드하고 동일한 방법을 호출 할 수 있습니다.

+0

실제로 에서 출력을 얻는 것은 오류 처리가 포함 된 경우에도 * way *가 더 간단합니다. – stijn

+0

@stijn 그래도 git.exe가 필요합니다. – Jez

+0

네, 그렇습니다.하지만, 요즘 요구 사항으로 설치되어있는 git를 사용하는 것은 드문 일이 아닙니다. 왜냐하면 afaik가 모든 단일 git 기능을 VS에서 구현하지 않기 때문입니다. – stijn

관련 문제