2012-10-18 9 views
10

Sono totalmente nuovo alle funzioni e alle condizioni nei file .csproj, quindi ogni aiuto è apprezzato.Come faccio a testare le direttive del compilatore con una condizione MSBuild in un file .csproj?

Quello che voglio fare è controllare una specifica direttiva del compilatore nella configurazione corrente. Un esempio potrebbe essere qualcosa di simile al seguente:

<Choose> 
    <When Condition= [current configuration has CONST-1 compiler constant defined] > 
     ... 
    </When> 
    <When Condition= [current configuration has CONST-2 compiler constant defined] > 
     ... 
    </When> 
</Choose> 

Non so se questo sia possibile o meno. Se c'è un modo migliore per fare quello che sto chiedendo fammelo sapere anche questo. Ad ogni modo, voglio provare una condizione indipendente dalla della configurazione.

EDIT

Quello che voglio davvero è un valore che posso modificare facilmente, preferibilmente all'interno di Visual Studio, che posso anche controllare regargless del configuraiton. Ho pensato alle costanti del compilatore perché puoi facilmente modificarle nelle proprietà del progetto in VS.

+0

Probabilmente più comune sarebbe utilizzare un elemento 'Property'. Il tuo file csproj avrà già elementi 'PropertyGroup' condizionali, a seconda della configurazione. Al loro interno, puoi aggiungere nuovi elementi 'Property' personalizzati, e puoi testarli nel solito modo nell'attributo' Condition = '. Potrebbe funzionare per te, o hai davvero bisogno di direttive per i compilatori? Sono più complicati, perché ci sono vari modi in cui potrebbero essere definiti. – hvd

+0

Potrebbe. C'è un modo per modificare gli elementi delle proprietà personalizzate, dopo averli aggiunti, in VS facilmente senza dover modificare il file .csproj ogni volta che voglio cambiarli? –

+0

Quello che voglio è un valore definito che posso cambiare e controllare indipendentemente dalla configurazione. –

risposta

8

Le costanti del compilatore sono impostate in una proprietà "DefineConstants", quindi è necessario essere in grado di valutare tale proprietà. L'istruzione Choose deve andare dopo i PropertyGroup che definiscono le costanti o all'interno di una destinazione.

<Choose> 
    <When Condition="$(DefineConstants.Contains(CONST-1))"> 
     ... 
    </When> 
    <When Condition="$(DefineConstants.Contains(CONST-2))"> 
     ... 
    </When> 
</Choose> 
+1

Grazie questo ha funzionato perfettamente ... Comunque ho dovuto rimuovere le virgolette attorno a CONST-1 o qualunque sia la definizione condizionale – Randeep

5

Se si utilizza MSBuild 4 o versione successiva, è consigliabile utilizzare Espressione regolare anziché String.Contains(). La ragione di ciò è che, sebbene String.Contains() di solito funzioni bene, ci sono alcuni casi in cui potresti avere problemi.

Ad esempio:

Considerate caso in cui si utilizzano le direttive CONST-1 e CONST-12 nel codice. Tuttavia, si decide di definire solo la direttiva CONST-12 per la build corrente.
Ora Condition="$(DefineConstants.Contains('CONST-1'))" restituisce True anche se CONST-1 non è definito.

Soluzione con RegularExpressions.RegEx:

<When Condition="$([System.Text.RegularExpressions.Regex]::IsMatch($(DefineConstants), '^(.*;)*CONST-1(;.*)*$'))"> 
... 
</When> 

In sintesi, è possibile stare attenti a fare in modo di non utilizzare la direttiva che è sottostringa di un altro oppure è possibile utilizzare l'espressione regolare e non preoccuparsi tutti.

0

Per aggiungere alle altre risposte pubblicate qui, un altro modo per avvicinarsi a questo è avvolgere la proprietà DefineConstants con il punto e virgola, per garantire che "; CONST-1;" sarà contenuto in DefineConstants se e solo se è definita la costante "CONST-1". Senza il punto e virgola, si potrebbe avere CONST-100 o UNCONST-1, ma non CONST-1, come variabile e verrebbe valutata su true.

<PropertyGroup> 
    <DefineConstants2>;$(DefineConstants);</DefineConstants2> 
    <Foo Condition="'$(DefineConstants2.Contains(`;CONST-1;`))'">It worked</Foo> 
    <Bar>$(Foo)</Bar> <!--It worked--> 
</PropertyGroup> 
Problemi correlati