2016-08-07 34 views
1

Ist es möglich, eine optionale <PreBuildEvent> in einer *.csproj Datei zu haben? Ich habe folgendes:Optional PreBuildEvent in MSBuild?

Dies gibt den neuesten Git-Hash in eine Datei, die an anderer Stelle in die ausführbare Datei eingebettet ist.

Da ich ein Universitätsstudent bin, schreibe ich häufig Code auf den Universitätsmaschinen (und nicht meine Linux-Maschine zu Hause), die SVN und nicht git haben und den Bauprozess fehlschlagen lassen. Ist es möglich, das obige <PreBuildEvent /> optional so zu machen, dass, wenn git nicht installiert ist, der Build-Prozess nicht fehlschlägt?

Antwort

2

Wenn Sie nur das Build-Ereignis überspringen, erhalten Sie eine leere git-hash.txt, was nicht die beste Idee ist. Stattdessen könnten Sie einfach versuchen, den Befehl git auszuführen, und wenn dies fehlschlägt, schreiben Sie einen Dummy-Hash in die Datei. Ich kenne die Befehlszeilensyntax nicht, um dies zu tun (ein PreBuildEvent läuft unter cmd.exe), also hier ist eine Msbuild-Lösung. Wegen der BeforeTargets="Build" wird es auch vor dem Build ausgeführt.

<Target Name="WriteGitHash" BeforeTargets="Build"> 
    <Exec Command="git --work-tree=$(Repo) --git-dir=$(Repo)\.git rev-parse HEAD 2> NUL" ConsoleToMSBuild="true" IgnoreExitCode="True"> 
    <Output TaskParameter="ConsoleOutput" PropertyName="GitTag" /> 
    </Exec> 
    <PropertyGroup> 
    <GitTag Condition="'$(GitTag)' == ''">unknown</GitTag> 
    </PropertyGroup> 
    <WriteLinesToFile File="$(Repo)\git-hash.txt" Lines="$(GitTag)" Overwrite="True"/> 
</Target> 

Einige Anmerkungen:

  • Die 2> NUL leiten Standardfehler an den Ausgang wird so GitTag im Fall eines Fehlers leer sein, in welchem ​​Fall es auf 'unbekannt'
  • auf dem Set Unter Berufung Das aktuelle Verzeichnis ist fast immer eine schlechte Idee, also geben Sie das Verzeichnis an, in dem Git explizit in einer Eigenschaft ausgeführt werden soll
  • Dasselbe gilt für die Ausgabedatei
+0

Danke für die Antwort. Ist die '$ (Repo)' Variable eingebaut? – starbeamrainbowlabs

+0

Nein, Entschuldigung sollte klarer sein. Es ist eine Eigenschaft, die Sie selbst definieren müssen und die auf das Git-Repository verweist. Wenn dies das Verzeichnis ist, in dem sich die Projektdatei befindet, können Sie beispielsweise $ (ProjectDir) verwenden. – stijn

+0

Ah richtig. Da mein Lösungsverzeichnis ('$ (SolutionDir)', denke ich?) Der Stamm des Git-Repositories ist, werde ich das dann einfach verwenden. Diese Methode sieht viel besser aus als die, die ich verwendete :) – starbeamrainbowlabs