msbuild, das bedingte Kompilierungssymbole definiert

72

Ich bin möglicherweise nur blind, aber gibt es eine Befehlszeile, um bedingte Kompilierungssymbole in MSBUILD anzugeben?

Ich habe derzeit diese Zeile in meinem Buildscript:

SET MSBUILD=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
SET CONFIG=Debug
%MSBUILD% /p:Configuration=%CONFIG% /p:OutputPath=..\..\output source\MyProject\MyProject.csproj

Und ich möchte eine Bedingung hinzufügen. In Visual Studio kann ich einfach in Projekteigenschaften => Erstellen => Bedingte Kompilierungssymbole gehen, aber ich habe diese Option für msbuild nicht gesehen?

Bonus Karma, wenn Sie wissen, ob ich alle bereits in den .csproj-Dateien angegebenen Symbole vollständig überschreiben kann, um sicherzustellen, dass nur die Bedingungen aus meinem Buildscript eingehen.

Michael Stum
quelle
Übrigens ist dies kein Duplikat von stackoverflow.com/questions/296147/…, da die andere Frage denselben Titel hat, die Antwort jedoch nur die Änderung von Visual Studio / Project File enthält.
Michael Stum

Antworten:

129

Kennen Sie schon das ? (Die meisten Informationen finden Sie im vorletzten Beitrag)

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"
Tomalak
quelle
5
Code hinzugefügt, das wars, danke! Es überschreibt alle Konstanten, die in der .csproj-Datei definiert werden können, was ebenfalls gut ist.
Michael Stum
5
Damit dies für mich funktioniert, musste ich dies zur Befehlszeile hinzufügen: / t: Rebuild
Dan W
mit xbuild vom os x terminal bekomme ichMSBUILD: error MSBUILD0005: Invalid syntax. Property name and value expected as <prop name>=[<prop value>]
Sanandrea
Hat super funktioniert. / p: DefineConstants = "QCBUILD" Meine Lösung enthält viele Projekte. Dies scheint eine globale Lösung zu sein. Möchte mich jemand darauf hinweisen, wie man ein globales Symbol für die bedingte Kompilierung einer Lösung erhält, während man Visual Studio verwendet (keine Befehlszeile)?
user922020
2
Beachten Sie, dass dies ersetzen die bestehenden definiert, wenn Sie also auf Dinge wie NETCOREAPP oder Netframework wurden unter Berufung definiert ist, werden Sie diejenigen verlieren. Um an die vorhandenen Definitionen anzuhängen, fügen Sie Ihrer .csprojDatei besser eine Eigenschaft hinzu : <DefineConstants>$(DefineConstants);FOO;BAR</DefineConstants>.
Montag,
17

Ich musste in diesem Beitrag von Björn Lasar ein Leerzeichen anstelle eines Semikolons verwenden: http://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx

Update: Der Blog ist verschwunden; über das Internetarchiv abgerufen :

Vor kurzem musste ich MSBuild direkt verwenden, um einige Builds zu automatisieren. Ich musste auch einige Präprozessor-Definitionen basierend auf einer Konfiguration konfigurieren. Dies geschieht normalerweise durch ein solches Argument

"/p:DefineConstants=MY_PREPROC_FLAG"

Nichts Besonderes hier, da es im Web genügend Kommentare dazu gibt. Heute brauchte ich ein Flag mehr und verwendete die Befehlszeilensyntax ähnlich wie ich sie von der IDE kannte:

"/p:DefineConstants=MY_PREPROC_FLAG;YET_ANOTHER_FLAG"

aber dieser hat nicht funktioniert.

Der Punkt ist also, dass Sie, wenn Sie mehrere Definitionen für ein Projekt über die Befehlszeile unterstützen möchten, diese durch einfache Leerzeichen trennen müssen ...

"/p:DefineConstants=MY_PREPROC_FLAG YET_ANOTHER_FLAG" 

und es wird zu den (durch Semikolons getrennten) Definitionen aus der IDE hinzugefügt. Gut zu wissen, denke ich ...

Ruben Bartelink
quelle
@Brody fertig. FWIW der akzeptierte Beitrag (den ich positiv bewertet habe) ist wahrscheinlich noch schuldiger, aber die Flut ist noch nicht darauf ausgegangen: D
Ruben Bartelink
Wie testen Sie die Existenz dieser Symbole? Ich habe versucht, wenn '$ (SIGN_ASSEMBLY)' == '' goto: exit, aber wenn das Symbol nicht existiert, erhalten Sie dieselbe leere Zeichenfolge.
Quarkly
@MikeDoonsebury verwendet man immer das Vorhandensein eines Wertes und seinen spezifischen Wert, dh == "True"- nicht sicher, was Sie mit dem goto-Exit in msbuild meinen - das Äquivalent wäre, einen Conditionauf den <Taskund / oder auf den Aufgabenaufruf zu setzen, z. B.<Exec Condtion="$(SignAssembly)=='True' ...
Ruben Bartelink
2

/p:DefineConstants ist ein Alles-oder-Nichts-Geschäft.

Wenn Sie nur das Trace-Symbol deaktivieren möchten, können Sie dies nicht einfach tun mit: msbuild /p:DefineTrace=false

Sie müssen etwas definieren, um alle bereits definierten Symbole zu überschreiben: msbuild /p:DefineConstants="RANDOM-SYMBOL"

Danke Michael Stum weist auf diese versteckte Regel hin Ich habe auch einen Blog darüber geschrieben --- toter Link

Leliao
quelle
1
"Alle Symbole" ist hier wirklich wichtig. Wenn Sie / p: DefineConstants verwenden, um eine Konstante zu definieren, verlieren Sie alle anderen definierten Konstanten in einem Projekt. DefineConstants sollte alle Konstanten enthalten, die im Projekt benötigt werden. Sie können keine Konstanten mischen und abgleichen, die im Projekt definiert und mit DefineConstants
Jitendra
1

Was in den Antworten gesagt wird, gilt sowohl für C#Code als auch für ASP.NET-C # -Code "codebehind". Wenn Sie in ASP.NET-Webprojekten auch eine bedingte Kompilierung auf den ASPX-Seiten durchführen möchten, funktioniert das bedingte Rendern von HTML auf der Seite etwas anders (Hinweis, den ich entfernt habe, MasterPageFile="..." AutoEventWireup="true" CodeBehind="..." Inherits="..."den Sie normalerweise auch in der <%@ ... %>Deklaration haben):

<%@ Page Title="MyPage" Language="C#" CompilerOptions="/d:DebugSym1;DebugSym2" %>

<% #if DebugSym1 %>         
    <h4>Section1</h4>
<% #else %>
    <h4>(Section 1 skipped)</h4>
<% #endif %>

<% #if DebugSym2 %>         
    <h4>Section2</h4>
<% #else %>
    <h4>(Section 2 skipped)</h4>
<% #endif %>

Wenn Sie das entfernen DebugSym1oder DebugSym2aus dem entfernen CompilerOptions, wird der #elseTeil der entsprechenden #ifAnweisung gerendert.

Ich dachte, dies ist der Vollständigkeit dieses Themas wert und kann Ihnen Zeit sparen. Weitere Informationen finden Sie in diesem Artikel , wenn Sie interessiert sind.

Matt
quelle