Condizioni di MSBuild

MSBuild supporta un set specifico di condizioni che possono essere applicate ovunque sia consentito un Condition attributo. Vedere Elementi supportati. La tabella seguente illustra tali condizioni.

Condizione Descrizione
'stringA' == 'stringB' Restituisce true se stringA è uguale a stringB.

Ad esempio:

Condition="'$(Configuration)'=='DEBUG'"

Le virgolette singole non sono necessarie per semplici stringhe alfanumerici o valori booleani. Sono tuttavia obbligatorie per i valori vuoti. Questo controllo non fa distinzione tra maiuscole e minuscole.
'stringA' != 'stringB' Restituisce true se stringA non è uguale a stringB.

Ad esempio:

Condition="'$(Configuration)'!='DEBUG'"

Le virgolette singole non sono necessarie per semplici stringhe alfanumerici o valori booleani. Sono tuttavia obbligatorie per i valori vuoti. Questo controllo non fa distinzione tra maiuscole e minuscole.
<, , ><=, >= Restituisce i valori numerici degli operandi. Restituisce true se la valutazione relazionale è true. Gli operandi devono restituire un numero decimale o esadecimale o una versione punteggiata in quattro parti. I numeri esadecimali devono iniziare con 0x. Nota: in XML i caratteri < e > devono essere preceduti da un carattere di escape. Il simbolo < viene rappresentato come &lt;. Il simbolo > viene rappresentato come &gt;.
Exists('stringA') Restituisce true se esiste un file o una cartella con il nome stringA.

Ad esempio:

Condition="!Exists('$(Folder)')"

Le virgolette singole non sono necessarie per semplici stringhe alfanumerici o valori booleani. Sono tuttavia obbligatorie per i valori vuoti. Questa condizione non espande i caratteri jolly, *ad esempio .
HasTrailingSlash('stringA') Restituisce true se la stringa specificata contiene una barra finale (\) o un carattere barra (/).

Ad esempio:

Condition="!HasTrailingSlash('$(OutputPath)')"

Le virgolette singole non sono necessarie per semplici stringhe alfanumerici o valori booleani. Sono tuttavia obbligatorie per i valori vuoti.
! Restituisce true se l'operando restituisce false.
And Restituisce true se entrambi gli operandi restituiscono true.
Or Restituisce true se almeno uno degli operandi restituisce true.
() Meccanismo di raggruppamento che restituisce true se le espressioni contenute all'interno restituiscono true.
$if$ ( %expression% ), $else$, $endif$ Controlla se l'oggetto %expression% specificato corrisponde al valore stringa del parametro di modello personalizzato passato. Se la condizione $if$ restituisce true, le istruzioni vengono eseguite. In caso contrario, viene controllata la condizione $else$. Se la condizione $else$ è true, le istruzioni vengono eseguite. In caso contrario, la condizione $endif$ termina la valutazione dell'espressione.

Per esempi di utilizzo, vedere Visual Studio Project/Item Template Parameter Logic (Logica dei parametri dei modelli di elemento/progetto di Visual Studio).

L'elemento Condition è una singola stringa e quindi tutte le stringhe usate nell'espressione, inclusi i valori delle proprietà, devono essere racchiuse tra virgolette singole. Gli spazi tra gli operatori sono consentiti e comunemente usati per la leggibilità, ma non sono necessari.

Per usare gli operatori booleani And e Or , specificare gli operandi all'interno del Condition valore stringa dell'elemento, come nell'esempio seguente:

Condition="'$(Configuration)' == 'Debug' And '$(MSBuildProjectExtension)' == '.csproj'"

È possibile concatenare gli operatori booleani. L'operatore And ha una precedenza maggiore di Or, ma per maggiore chiarezza, è consigliabile usare le parentesi quando si usano più operatori booleani per rendere esplicita l'ordine di valutazione. In caso contrario, MSBuild visualizza un avviso MSB4130.

È possibile usare i metodi stringa in condizioni, come illustrato nell'esempio seguente, in cui la funzione TrimEnd() viene usata per confrontare solo la parte pertinente della stringa, per distinguere tra framework di destinazione .NET Framework e .NET Core.

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFrameworks>net45;net48;netstandard2.1;netcoreapp2.1;netcoreapp3.1</TargetFrameworks>
    </PropertyGroup>

    <PropertyGroup Condition="'$(TargetFramework.TrimEnd(`0123456789`))' == 'net'">
        <!-- Properties for .NET Framework -->
    </PropertyGroup>

</Project>

Nei file di progetto MSBuild non esiste alcun tipo booleano vero. I dati booleani sono rappresentati in proprietà che potrebbero essere vuote o impostate su qualsiasi valore. Pertanto, '$(Prop)' == 'true' significa "se Prop è true", ma '$(Prop)' != 'false' significa "se Prop è true o unset o impostato su qualcos'altro".

La logica booleana viene valutata solo nel contesto delle condizioni, pertanto le impostazioni delle proprietà, ad <Prop2>'$(Prop1)' == 'true'</Prop> esempio, vengono rappresentate come stringa (dopo l'espansione della variabile), non valutate come valori booleani.

MSBuild implementa alcune regole di elaborazione speciali per semplificare l'uso delle proprietà stringa usate come valori booleani. I valori letterali booleani vengono accettati, quindi Condition="true" funzionano Condition="false" come previsto. MSBuild include anche regole speciali per supportare l'operatore di negazione booleano. Pertanto, se $(Prop) è "true", !$(Prop) si espande a e questo valore confronta uguale a !true false, come previsto.

Confronto delle versioni

Gli operatori <relazionali , >, <=e >= supportano le versioni analizzate da System.Version, in modo da poter confrontare le versioni con quattro parti numeriche l'una con l'altra. Ad esempio, '1.2.3.4' < '1.10.0.0' è true.

Attenzione

System.Version i confronti possono produrre risultati sorprendenti quando una o entrambe le versioni non specificano tutte e quattro le parti. Ad esempio, la versione 1.1 è precedente alla versione 1.1.0.

MSBuild fornisce funzioni di proprietà per confrontare le versioni con un set diverso di regole compatibili con il controllo delle versioni semantiche (semver).

Espansioni in condizioni

A seconda della posizione nel file di progetto, è possibile usare le espansioni per le proprietà ($), gli elenchi di elementi (@) e i metadati degli elementi (%). Le espansioni dipendono dal modo in cui MSBuild elabora i file di progetto.

Proprietà

Condizione che contiene un'espressione, $(SomeProperty) ad esempio viene valutata e convertita nel valore della proprietà. Se la condizione è esterna a una destinazione, l'espressione viene valutata durante la valutazione del file di progetto. Il valore della proprietà dipende dalla posizione nel file di progetto dopo l'espansione di tutte le importazioni. Se la condizione si trova in una destinazione, viene valutata quando viene eseguita la destinazione e il valore è interessato da eventuali modifiche che si verificano durante l'esecuzione della compilazione.

Proprietà non definita nel punto del file di progetto espanso in cui l'espressione della condizione restituisce una stringa vuota, senza errori diagnostici o avvisi.

Elenchi di elementi

Una condizione che contiene un'espressione @-expression, @(SomeItems) ad esempio, viene espansa nei gruppi di elementi al livello superiore e nelle destinazioni.

Gli elementi possono dipendere da qualsiasi proprietà e possono dipendere da elementi già definiti in sequenza.

Il motivo è che MSBuild elabora i file di progetto in diversi passaggi. Il passaggio di valutazione dell'elemento viene eseguito dopo la valutazione iniziale della proprietà e il passaggio di espansione dell'importazione. Pertanto, le espressioni @-sono consentite in qualsiasi condizione valutata dopo che gli elementi hanno iniziato a essere definiti. Ovvero, negli elementi, nei gruppi di elementi e nelle destinazioni.

Metadati UFX

Condizione che contiene un'espressione di metadati, %(ItemMetadata) ad esempio, viene espansa negli stessi contesti degli elenchi di elementi, ovvero nei gruppi di elementi al livello superiore e nelle destinazioni. Tuttavia, l'espansione può avere un comportamento diverso in un gruppo di elementi a seconda che il gruppo di elementi si trova all'esterno di una destinazione o all'interno di una destinazione. Inoltre, delle varie forme di espressioni di metadati, %(ItemName.MetadataName), %(JustTheMetadataName)e @(ItemName->'%(MetadataName)'), solo la trasformazione dell'elemento (l'ultima) è consentita all'esterno di una destinazione. Il valore di un'espressione %-expression in una destinazione viene valutato in fase di esecuzione e dipende da eventuali modifiche di stato durante l'esecuzione della destinazione. L'esecuzione della destinazione e il valore di qualsiasi %-expression contenuta in esso dipende anche dall'invio in batch della destinazione e può anche attivare l'invio in batch; vedere Invio in batch di MSBuild.

Elementi supportati

Gli elementi seguenti supportano l'attributo Condition :

  • Import
  • ImportGroup
  • Articolo
  • ItemDefinitionGroup
  • ItemGroup
  • ItemMetadata
  • OnError
  • Output
  • Proprietà
  • PropertyGroup
  • Destinazione
  • Attività
  • UsingTask
  • Se

Vedi anche