2009-10-01 10 views
8

Ich versuche, eine MSBuild-Datei einzurichten, die eine andere MSBuild-Datei aufrufen wird, und ich frage mich, was der beste Weg ist, dies zu erreichen.MSBuild Task zum Ausführen einer externen MSBuild-Datei

Wir verwenden es in dem Szenario, in dem ein Build-Server eine MSBuild-Datei herunterlädt, die dann abhängig von den Parametern die entsprechende zweite Datei ausführt.

Ich weiß, ich kann nur die <Exec Command="msbuild.exe ..." /> Aufgabe verwenden, aber das scheint ein bisschen von Hacky Weg, es zu tun.

Gibt es eine einfachere Möglichkeit, MSBuild zu verwenden, um eine andere MSBuild-Datei auszuführen?

Antwort

13

Sie können die verwenden, um ein Ziel in einem anderen MSBuild-Projekt zu erstellen.

Sie können das Ziel auch in eine externe .targets-Datei einfügen, die von beiden MSBuild-Projekten importiert wird, und das CallTarget task verwenden, um es zu erstellen.

Update: Um einen externen Befehl auszuführen, verwenden Sie die Exec task.

+0

Ahh! Ich wusste, dass es einen besseren Weg geben musste. Ich war zuvor nicht mit der MSBuild-Aufgabe konfrontiert :) –

+1

Wie verwende ich MSBuild Task, um eine externe Datei auszuführen? Können Sie zeigen, wie das geht? –

2

Antwort auf Adam Orens Kommentar: Hier ist ein Beispiel zum Ausführen einer externen Datei - in diesem Fall startet es Nunit. Das% 22 ist für die Flucht, es bedeutet ", so dass Sie Leerzeichen in Ihrem ausführbaren Pfad haben.

<Exec Command="%22$(NUnit_Install_Directory)bin\net-2.0\nunit-console.exe%22 
/noshadow @(TestableAssemblies, ' ') /xml 
$(BuildFilesPath)\NCover-NUnit-Results.xml" /> 

Sie müssen keine Variablen verwenden, wie ich tat, aber ich finde, dass es Ihre Skripte mehr tragbar macht. $ (NUnit_Install_Directory) ist definiert als

<PropertyGroup> 
    <NUnit_Install_Directory>c:\Program Files\NUnit 2.5.3\</NUnit_Install_Directory> 

7

Es ist nicht nur schönere eher die <MSBuild> Aufgabe zu verwenden, als <Exec Command="msbuild.exe .."/>. Es bedeutet, dass die einzelnen MSBuild Prozess kennt alle Projekte gebaut, und die es gibt keine Kollisionen; Ein bestimmtes Projekt kann nicht von zwei Threads gleichzeitig erstellt werden. Das ist normalerweise wichtig, wenn Sie mit "/ m" bauen. Es gibt auch noch andere Vorteile, zum Beispiel, dass es einen Logger für den gesamten Build gibt.

0
<Target Name="TA"> 
    <CallTarget Targets="TB"/> 
</Target> 

<Target Name="TB"> 
    <Message Text="TB..." /> 
</Target> 
Verwandte Themen