2016-07-14 15 views
3

Ich arbeite daran, den Build/Deploy-Prozess unserer Software zu automatisieren. Ein wichtiger Teil davon ist die Ausführung von msbuild, um mehrere Delphi-Projekte zu kompilieren.Wie führe ich MSBuild von Delphi aus?

Nach zahlreichen Ressourcen such as this one, kann ich es erfolgreich von der RAD Studio Command Line (die einfach aufrufen rsvars.bat, um einige Umgebungsvariablen setzen) tun. Wenn ich jedoch versuche, diese Batchdatei und den Befehl msbuild aus Delphi zu automatisieren, kann ich nicht herausfinden, wie ich vorgehen soll.

Der Schlüssel des Problems ist, dass die Batchdatei und der eigentliche msbuild Befehl zwei völlig separate Befehle sind - obwohl sie in derselben Umgebung zusammen ausgeführt werden müssen. Ich fand this question etwas verwandt, aber ich sehe keine klare Antwort für mein Szenario.

Wie kann ich msbuild von Delphi ausführen, während ich es zuerst mit den Umgebungsvariablen wie in rsvars.bat gefunden vorbereite?

+1

Wenn es nach mir ginge würde ich Port rsvars zu Delphi und erstellen msbuild Prozess direkt –

Antwort

8

Wie this answer gezeigt, können Sie cmd.exe selbst mit Befehlszeilenparametern ausführen, um Befehle auszuführen.

Per der cmd.exe documentation:

Syntax

cmd [/c|/k] [/s] [/q] [/d] [/a|/u] [/t:{<B><F>|<F>}] [/e:{on|off}] [/f:{on|off}] [/v:{on|off}] [<String>] 

Parameter

/c
die von String angegebenen Befehl ausführt und hält dann an.
...
<Zeichenfolge>
Gibt den Befehl an, den Sie ausführen möchten.
...

Bemerkungen

  • mehrere Befehle

    Verwenden mehrerer Befehle für <String>, trennen Sie diese durch den Befehl Separator & & und schließen Sie sie in Anführungszeichen zu verwenden. Zum Beispiel:

    "<Command>&&<Command>&&<Command>" 
    
  • Verarbeitung Anführungszeichen

    Wenn Sie /c oder /k, cmd Prozesse den Rest String und Anführungszeichen sind erhalten geben Sie nur, wenn alle der folgende Bedingungen erfüllt sind:

    • Sie nicht verwenden/s.

    • Sie verwenden genau einen Satz Anführungszeichen.

    • Sie verwenden in den Anführungszeichen keine Sonderzeichen (z. B. & < > () @^|).

    • Sie verwenden ein oder mehrere Leerzeichen in den Anführungszeichen.

    • Die Zeichenfolge in Anführungszeichen ist der Name einer ausführbaren Datei.

    Wenn die vorherigen Bedingungen nicht erfüllt sind, String wird durch die Prüfung des ersten Zeichens verarbeitet, um zu überprüfen, ob es sich um ein öffnendes Anführungszeichen ist. Wenn das erste Zeichen ein öffnendes Anführungszeichen ist, wird es mit dem schließenden Anführungszeichen entfernt. Jeder Text, der auf die schließenden Anführungszeichen folgt, bleibt erhalten. So

versuchen CreateProcess() oder ShellExecute/Ex() mithilfe einer Instanz von cmd.exe mit diesen Parametern ausgeführt wird:

cmd.exe /C ""<path>\rsvars.bat" && msbuild "<path>\project" <msbuild parameters> ..." 

Alternativ können Sie Ihre App Last rsvars.bat haben und die Werte analysieren, es definiert (oder definieren Sie einfach die Werte in Ihrem eigenen Code) und führen dann msbuild unter Verwendung von CreateProcess() aus und übergeben die gewünschten Umgebungsvariablen zu seinem lpEnvironment Parameter. Auf diese Weise müssen Sie rsvars.bat überhaupt nicht ausführen.

+0

Sind die Anführungszeichen sollen um alle Parameter gewickelt werden? Ich denke, das ist es, was mich abstößt, weil einige der Parameter selbst ihre eigenen Anführungszeichen um die vollständigen Pfad-/Dateinamenwerte haben. –

+0

@JerryDodge: Laut der Dokumentation, die ich gepostet habe, muss die gesamte '' in Anführungszeichen gesetzt werden, um '&&' zu verwenden, und die einzelnen Befehle können auch ihre eigenen zitierten Parameter haben. Ich habe meine Antwort mit einem größeren Zitat der Dokumentation aktualisiert. –

+0

Danke, das hat den Trick gemacht. Aber jetzt versuche ich, die Datei 'rsvars.bat' komplett zu ignorieren und' msbuild' direkt aufzurufen. –

3

Eine andere Möglichkeit, die funktioniert, besteht darin, beide Befehle in einer anderen neuen Stapeldatei zusammenzufassen. Auf diese Weise können Sie auch mehrere Projekte mit derselben Umgebung erstellen. Zum Beispiel DoBuild.bat mit folgendem Inhalt:

call "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\rsvars.bat" 
msbuild "<path>\MyProject.dproj" 
msbuild "<path>\MyOtherProject.dproj" 
msbuild "<path>\YetAnotherProject.dproj" 

Dann führen Sie einfach Ihre Batch-Datei:

Cmd.exe /K "<path>\DoBuild.bat" 
+2

Wenn Sie '/ C' verwenden, wird 'cmd.exe' beendet, nachdem der Befehl beendet wurde. Wenn Sie stattdessen '/ K' verwenden, läuft es weiter. –

+0

@Remy Dilly bemerkt und aktualisiert. Vielen Dank. –