Geben Sie die Projektdatei einer Lösung mit msbuild an


116

Ich möchte die Befehlszeile zum Erstellen eines bestimmten Projekts einer Lösung mit msbuild, wie wir es mit devenv.com tun. In devenv.com können wir ein Projekt einer Lösung über die folgende Befehlszeile angeben

devenv.com /Build Release|x86 test.sln /project "testproject"

Mit der obigen Befehlszeile kann ich das Testprojekt in der Datei test.sln mit devenv.com erstellen. Wie lautet die Befehlszeile für msbuild für dieselbe Lösung?

Vielen Dank


Gibt es einen Grund, warum Sie das Testprojekt nicht einfach an msbuild übergeben?
Mark Smith

2
Da kann ich meinen Kommentar nicht mehr bearbeiten. Was ich meine, ist das Projekt direkt anstelle der Lösung zu referenzieren. "msbuild testproject / p: Konfiguration = Release / p: Plattform = x86"
Mark Smith

Unterschiedliche Zeit Ich muss verschiedene Projekte erstellen. Mit devenv.com ist es einfach, das Projekt dieser Lösung
anzugeben

Wenn dies das einzige Problem ist, sollten Sie msbuild verwenden können, um die erforderlichen Projekte zum richtigen Zeitpunkt zu erstellen. Sie haben bereits verschiedene Befehle, die Sie zu unterschiedlichen Zeiten in der Lösung ausführen. Warum also nicht einfach die Projekte zu den richtigen Zeiten mit verschiedenen msbuild-Befehlen referenzieren? Wenn Ihre Projekte korrekt eingerichtet sind, sollten sie alle ihre Referenzen herausfinden, ohne die sln-Datei zu verwenden.
Mark Smith

Antworten:


201
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Beachten Sie, dass /tder Projektname in der Lösung zugewiesen ist und sich vom Namen der Projektdatei unterscheiden kann.

Auch, wie in angegeben Build - spezifischen Zielen in Lösungen von MSBuild.exe mit: Wie :

Wenn der Projektname darf keines der Zeichen enthält %, $, @, ;, ., (, ), oder ', ersetzen Sie sie durch einen _in den angegebenen Zielnamen.

Sie können auch mehrere Projekte gleichzeitig erstellen:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Zum Wiederherstellen oder Reinigen wechseln Sie /t:projectzu /t:project:cleanoder/t:project:rebuild


98
Ein wichtiger Hinweis: Wenn Ihr Projekt ein '.' im Namen müssen Sie es durch ein '_' ersetzen, wenn Sie es mit / t
angeben

4
@easton Zum Erstellen mehrerer Projekte war die Synthax für mein msbuild, um den /tParameter für jedes zu erstellende Projekt zu wiederholen :msbuild test.sln /t:project /t:project2
Philippe

46
Wenn Sie einen Lösungsordner verwenden, müssen Sie dem Projektnamen den Ordnernamen und einen Schrägstrich voranstellen. Wie bei @Watusimoto oben erwähnt, müssen Sie Punkte (.) Im Namen durch Unterstriche (_) ersetzen. Am Ende hatte ich so etwas : /t:SlnFolder\My_Project_name.
Travis Parks

28
@TravisParks: Erwähnenswert ist möglicherweise auch, dass sich "Lösungsordner" nicht auf einen Dateisystemordner bezieht, sondern auf einen Ordner in der Ansicht "Projektmappen- Explorer".
Joshbodily

4
Ich musste auch '(' und ')' durch '_' im Ordnernamen ersetzen (GYP generierte Projekte). Ich denke, es sind alle Sonderzeichen, die durch Unterstriche ersetzt werden.
Maxime Viargues

15

MSBuild arbeitet tatsächlich durch die Verwendung von Projekten, nicht durch die Lösung. Die Lösung wird nur verwendet, um sie intern in eine temporäre Projektdatei in MSBuild zu analysieren. Sie sollten in der Lage sein, das gewünschte Projekt direkt über MSBuild zu erstellen, indem Sie den folgenden Befehl ausführen.

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

Ich weiß, dass es ein großes Problem gibt, bei dem Sie das Projekt direkt anstelle der Lösung verwenden könnten: Wenn Sie die Lösung verwenden, um Abhängigkeiten zwischen den Projekten auszudrücken, anstatt die Verweise auf das Projekt hinzuzufügen und das Build-System die Abhängigkeiten automatisch berechnen zu lassen .

Wenn Sie eine Erstellungsreihenfolge mithilfe der sln-Datei erzwingen, empfehle ich, diese Abhängigkeiten direkt in die proj-Dateien zu integrieren und sie aus der sln zu entfernen. Auf diese Weise können Sie jede Projektdatei direkt von MSBuild aus aufrufen, und die Projekte werden alle ohne zusätzliche Arbeit unabhängig voneinander erstellt. Sie sollten die sln-Datei wirklich als eine Gruppe von Projekten behandeln, um die Arbeit in Visual Studio zu vereinfachen, und nicht als Build-Eingabe.


4
Bitte weisen Sie darauf hin, wie die Erstellungsreihenfolge aus den Projektdateien erzwungen werden kann. Vielen Dank.
ProgramCpp

4
Hier ist ein weiteres Problem bei der direkten Verwendung des Projektnamens. Zum Beispiel haben Sie 5 Projekte in Ihrer Lösung. Einige Projekte haben eine DebugPro-Konfiguration und andere Projekte haben diese nicht. Wenn Sie ein Projekt mit der Konfiguration erstellen, dass alle Projekte alle Dateien haben, wissen Sie nur, welche Projektkonfiguration für jedes Projekt verwendet werden soll, wenn Sie die Lösungskonfiguration DebugPro ausgewählt haben.
Alex

@ProgramCpp Wenn Sie Referenzen von einem Projekt zu einem anderen hinzufügen, wird automatisch festgestellt, dass das referenzierte Projekt zuerst erstellt werden muss.
Jpaugh

Ein weiterer Nachteil dieses Ansatzes besteht darin, dass der relative Pfad im Projekt relativ zur Lösungsdatei aufgelöst wird. Sobald Sie das Projekt direkt erstellt haben, ändert sich der relative Pfad. Die Ausgabe erfolgt möglicherweise an anderer Stelle, und Unit-Tests suchen möglicherweise nach falschen Verzeichnissen.
Tomas Kubes

Probleme können auch auftreten, wenn Sie Lösungsvariablen in der Projektkonfiguration verwenden, wie $ (SolutionDir)
Alex Che

8

Posting als Information für zukünftige Suchende

Fügen Sie dem Build-Skript Folgendes hinzu und führen Sie es einmal aus. Dadurch werden die genauen Ziele und andere Informationen generiert, die msbuild tatsächlich verwendet.

Beispiel: Wenn Sie .im Projektnamen oder in den Ordnern msbuild _anstelle von erwartet ..

set MSBuildEmitSolution=1

Nachdem Sie die Informationen erhalten haben, aktualisieren Sie das Build-Skript mit den erforderlichen Details.


6
"Wenn Sie haben". im Projektnamen oder in den Ordnern erwartet msbuild '_' anstelle des '.'. `
dhcgn

2

Um dies zu tun, müssen Sie wissen , was die Projektziel-Name ist, nicht unbedingt der Projektname.

Eine Möglichkeit, dies herauszufinden, besteht darin, MSBuild für Ihre SLN mit den beabsichtigten Parametern zu verwenden, nachdem Sie eine spezielle Umgebungsvariable festgelegt haben, die MSBuildEmitSolutionauf den Wert von aufgerufen wird 1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

Ich musste dies kürzlich aufgrund eines sehr spezifischen Namens für ein Ziel in verschachtelten Verzeichnissen tun. Aus meiner generierten Datei habe my_stuff.sln.metaprojich folgende Zeile gefunden:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

Das heißt, die zu verwendende Befehlszeile lautet:

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64

2
Das brauchte ich. Hinweis, wenn Sie dies nicht ausführen möchten: Ihr Ziel ist die Ordnerstruktur vom aktuellen Pfad zu Ihrer Projektdatei abzüglich der Projektdateierweiterung ( .csprojin meinem Fall). Ich <3 SO!
Keine Rückerstattung Keine Rückgabe

1

Um zusätzliche Informationen hinzuzufügen, wird beim Ausführen von msbuild im Projektordner standardmäßig die Projektdatei erstellt, da sie die einzige dort ist.

>msbuild

Es gibt viele Variationen der Verwendung von msbuild auf diese Weise. Sie können die proj-Datei direkt angeben.

>msbuild helloworld.csproj -t:Build.

Überprüfen Sie die msbuild-Dokumentation auf Verwendung, Anforderungen an die Projektdatei sowie die Vorteile des Erstellens des Projekts anstelle der Lösung.

MS MSBuild-Dokumentation

Es gibt Vorteile, auf diese Weise zu bauen, wie oben von Mark-Smith erwähnt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.