2009-01-26 140 views
54

Ich bin möglicherweise nur blind, aber gibt es eine Befehlszeile zum Angeben von bedingten Kompilierungssymbolen in MSBUILD?msbuild, Definieren von bedingten Kompilierungssymbolen

Im Moment habe ich 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 hinzuzufügen. In Visual Studio kann ich einfach in Projekteigenschaften => Build => Bedingte Kompilierungssymbole gehen, aber ich habe diese Option für Msbuild nicht gesehen?

Bonus Karma, wenn Sie wissen, wenn ich vollständig alle Symbole bereits angegeben in den CSPROJ Dateien, um sicherzustellen, außer Kraft setzen kann, dass nur das conditionals von meinem Buildscript in gehen.

+0

Und BTW, das ist kein Duplikat von http://stackoverflow.com/questions/296147/msbuild-conditional-compilation, weil die andere Frage den gleichen Titel hat, aber die Antwort nur Visual Studio/Project File-Änderung enthält. –

Antwort

108

Haben Sie this gesehen? (Die meisten Informationen ist in der vorletzten Post)

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2" 
+5

Hinzugefügt den Code, das war es, danke! Es überschreibt alle Konstanten, die in der .csproj-Datei definiert werden können, was ebenfalls gut ist. –

+1

Ich kann das Bonuskarma schon fühlen. ;-) – Tomalak

+4

Damit dies für mich funktioniert, war ich gezwungen, dies zur Befehlszeile hinzuzufügen:/t: Erstelle –

13

ich anstelle eines Semikolons a la dieser Beitrag von Björn Lasar einen Raum zu verwenden hatte: http://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx

Update: der Blog ist verschwunden;retrieved via Internet Archive:

Vor kurzem hatte ich direkt einige Builds zu automatisieren MSBuild zu verwenden. Ich musste auch einige Präprozessordefinitionen basierend auf einer Konfiguration konfigurieren. Dies wird in der Regel durch ein Argument wie dieses getan

"/p:DefineConstants=MY_PREPROC_FLAG" 

Nichts besonder hier, da es genug Kommentare im Web darüber sind. Heute brauchte ich eine Flagge mehr und ich verwenden, um die Kommandozeilen-Syntax ähnlich, wie ich wusste, dass es von der IDE:

"/p:DefineConstants=MY_PREPROC_FLAG;YET_ANOTHER_FLAG" 

aber dies hat nicht funktioniert.

Also der Punkt ist, dass, wenn Sie mehrere definiert zu einem Projekt von Kommandozeilen unterstützen möchten, müssen Sie sie durch einfache Leerzeichen trennen müssen ...

"/p:DefineConstants=MY_PREPROC_FLAG YET_ANOTHER_FLAG" 

und es wird hinzugefügt zu (Semikolon-getrennt) Definiert von der IDE. Gut zu wissen, dass ich denke ...

+2

Dies ist eine tote Verbindung. – chrish

+0

@Brody fertig. FWIW die angenommene Post (die ich upvoted) ist wahrscheinlich noch schuld, aber die Flut ist noch nicht darüber hinaus gegangen: D –

+2

@RubenBartelink - Schön gemacht. – Brody

0

/p:DefineConstants ist ein alles oder nichts Deal.

Wenn Sie nur Spuren Symbol deaktivieren möchten, können Sie nicht tun es einfach mit: msbuild /p:DefineTrace=false

Sie haben etwas zu definieren, alle bereits definierten Symbole außer Kraft zu setzen: msbuild /p:DefineConstants="RANDOM-SYMBOL"

Dank Michael Stum Punkt diese versteckte Regel out I have also wrote a blog about it

1

Was in den Antworten gesagt wird gilt für C# Code und auch für ASP.NET "codebehind" C# -Code.Für ASP.NET Web-Projekte, wenn Sie bedingte Kompilierung in den ASPX-Seiten auch tun möchten, funktioniert es ein bisschen anders, um HTML auf der Seite bedingt zu rendern (Hinweis Ich habe MasterPageFile="..." AutoEventWireup="true" CodeBehind="..." Inherits="..." entfernt, die Sie normalerweise in der <%@ ... %> Deklaration haben auch):

<%@ 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 DebugSym1 oder DebugSym2 aus den CompilerOptions entfernen, dann dem #else Teil der relevanten #if Aussage gemacht wird.

Ich dachte, dies war erwähnenswert für die Vollständigkeit dieses Themas und kann Ihnen Zeit sparen. Mehr können Sie in diesem article finden, wenn Sie interessiert sind.