2008-10-24 1 views
22

Ich habe eine MSBuild-Aufgabe ein bestimmtes Projekt in einer Lösung Datei zu erstellen. Es sieht etwa so aus:MSBuild: Festlegen eines Ziels von der Kommandozeile

<Target Name="Baz"> 
    <MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" /> 
</Target> 

in der Befehlszeile, kann ich meine BuildCmd entweder Rebuild oder Clean und es funktioniert wie erwartet eingestellt:

msbuild/target: Baz/Eigenschaft: BuildCmd = Rebuild MyMsbuildFile.xml msbuild/target: Baz/Eigenschaft: BuildCmd = Saubere MyMsbuildFile.xml

Aber welches Wort verwende ich BuildCmd t einstellen o um nur zu bauen? Ich habe versucht, Build und Compile und gerade gehen sie leer oder nicht definiert, aber ich habe immer einen Fehler.

msbuild/target: Baz/Eigenschaft: BuildCmd = Bauen MyMsbuildFile.xml Foo.sln: error MSB4057: Das Ziel "bar: Build" existiert nicht im Projekt.

msbuild/target: Baz/Eigenschaft: BuildCmd = Kompiliere MyMsbuildFile.xml Foo.sln: Fehler MSB4057: Das Ziel "bar: Compile" existiert nicht im Projekt.

msbuild/target: Baz MyMsbuildFile.xml Foo.sln: Fehler MSB4057: Das Ziel "bar:" existiert nicht im Projekt.

Antwort

21

verstand ich, dass Sie ein Ziel mit einem bestimmten Befehl bauen wollen: Build, Reinigen usw.

Dies ist, wie ich es tun würde.

Erstellen Sie eine Eigenschaft auf Ihrem Build Befehl erhalten, wenn nicht standardmäßig angegeben

<PropertyGroup> 
    <BuildCmd Condition=" '$(BuildCmd)' == ''">Build</BuildCmd> 
</PropertyGroup> 

Nach zu bauen, erstellen Sie das Ziel, das MSBuild mit dem angegebenen Ziel in dem Parameter beginnt:

<Target Name="Stackoverflow"> 
    <MsBuild Projects="Foo.sln" Targets="$(BuildCmd)" /> 
</Target> 

Rufen Sie dann Ihre MSBuild-Datei mit dem Ziel- und BuildCmd-Parameter wie folgt auf:

Stellen Sie nur sicher, dass das Ziel in der Projektmappe vorhanden ist.

+1

Ich versuche nur ein bestimmtes Projekt in Foo.sln zu erstellen. –

+0

Siehe meine Antwort unten. –

+0

"Stellen Sie nur sicher, dass das Ziel in der Projektmappe vorhanden ist." Wie fügst du einer SLN-Datei ein benutzerdefiniertes Ziel hinzu? –

-7

Bearbeiten Sie einfach die SLN-Datei selbst und finden Sie heraus - MSBuild ist eine wirklich einfache Syntax, nur nach Zielen suchen.

+3

Die .sln-Datei ist nicht in MSBuild-Syntax. –

6

Von: http://msdn.microsoft.com/en-us/library/ms164311.aspx

/Ziel: Ziele

diese Ziele in diesem Projekt baut. Verwenden Sie ein Semikolon oder ein Komma, um mehrere Ziele zu trennen, oder geben Sie jedes Ziel einzeln an./t ist ebenfalls akzeptabel. Zum Beispiel: /Ziel: Ressourcen; Kompilieren

+7

Das Problem ist, was mit jedem Ziel zu tun ist: Build, Rebuild, Clean. Ein Teil des Problems besteht darin, dass der Begriff "Ziel" in der Befehlszeile verwendet wird, um ein Ziel in der Msbuild-Datei anzugeben und um wiederum anzugeben, welches Projekt innerhalb einer Lösungsdatei erstellt werden soll (Namespace-Kollision). –

0

CheGueVerra der Vorlage verwenden, kam ich auf die folgende Lösung:

<PropertyGroup> 
    <ProjBuildCmd Condition="'$(BuildCmd)' != 'Build'">:$(BuildCmd)</ProjBuildCmd> 
    <SolnBuildCmd Condition="'$(BuildCmd)' != 'Build'">$(BuildCmd)</SolnBuildCmd> 
</PropertyGroup> 

Und dann statt direkt mit $(BuildCmd), verwende ich $(ProjBuildCmd) oder $(SolnBuildCmd) wie folgt aus:

<!-- Build the 'bar' project only --> 
<Target Name="Baz"> 
    <MSBuild Projects="Foo.sln" Targets="bar$(ProjBuildCmd)" /> 
</Target> 

<!-- Build the whole solution --> 
<Target Name="Baz2"> 
    <MSBuild Projects="Foo.sln" Targets="$(SolnBuildCmd)" /> 
</Target> 
+1

Diese Lösung funktioniert nicht für VS10 . Hast du irgendwelche Updates dazu? – Mike

2

Der Schlüssel ist konditionalisieren die BuildCmd-Eigenschaft.

<Target Name="Baz"> 
    <PropertyGroup> 
    <BuildCmd Condition="'$(BuildCmd)' != ''">:$(BuildCmd)</BuildCmd> 
    </PropertyGroup> 
    <MSBuild Projects="Foo.sln" Targets="bar$(BuildCmd)" /> 
</Target> 

Auf diese Weise wird der Doppelpunkt hinzugefügt, wenn Clean oder Rebuild festgelegt sind. Wenn nichts hinzugefügt wird, ist BuildCmd nur leer und wird standardmäßig auf das Build-Ziel gesetzt.

Hinweis - Die Eigenschaftsgruppe muss sich im Ziel befinden, oder sie wird überschrieben, wenn Sie sie in der Befehlszeile angeben.