Udostępnij za pośrednictwem


Warunki programu MSBuild

Program MSBuild obsługuje określony zestaw warunków, które można zastosować wszędzie tam, gdzie Condition jest dozwolony atrybut; zobacz Obsługiwane elementy. W poniższej tabeli opisano te warunki.

Warunek opis
'stringA' == 'stringB' Oblicza wartość , true jeśli stringA jest równa stringB.

Na przykład:

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

Pojedyncze cudzysłowy nie są wymagane w przypadku prostych ciągów alfanumerycznych ani wartości logicznych. Jednak pojedyncze cudzysłowy są wymagane dla pustych wartości. To sprawdzenie jest niewrażliwe na wielkość liter.
'stringA' != 'stringB' Oblicza wartość , true jeśli stringA wartość nie jest równa stringB.

Na przykład:

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

Pojedyncze cudzysłowy nie są wymagane w przypadku prostych ciągów alfanumerycznych ani wartości logicznych. Jednak pojedyncze cudzysłowy są wymagane dla pustych wartości. To sprawdzenie jest niewrażliwe na wielkość liter.
<, ><, =, >= = Oblicza wartości liczbowe operandów. Zwraca true wartość , jeśli ocena relacyjna ma wartość true. Operandy muszą oceniać liczbę dziesiętną lub szesnastkową albo czteroczęściową wersję kropkowaną. Liczby szesnastkowe muszą zaczynać się od 0x. Uwaga: w formacie XML znaki < i > muszą być znakiem ucieczki. Symbol < jest reprezentowany jako &lt;. Symbol > jest reprezentowany jako &gt;.
Istnieje('stringA') Ocenia, true czy plik lub folder o nazwie stringA istnieje.

Na przykład:

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

Pojedyncze cudzysłowy nie są wymagane w przypadku prostych ciągów alfanumerycznych ani wartości logicznych. Jednak pojedyncze cudzysłowy są wymagane dla pustych wartości. Ten warunek nie rozszerza symboli wieloznacznych, takich jak *.
HasTrailingSlash('stringA') true Oblicza, czy określony ciąg zawiera końcowy ukośnik odwrotny (\) lub ukośnik ukośnik (/).

Na przykład:

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

Pojedyncze cudzysłowy nie są wymagane w przypadku prostych ciągów alfanumerycznych ani wartości logicznych. Jednak pojedyncze cudzysłowy są wymagane dla pustych wartości.
! true Oblicza wartość , jeśli argument argumentu operand zwróci wartość false.
And true Oblicza wartość , jeśli oba operandy oceniają wartość true.
Or Oblicza wartość , true jeśli co najmniej jeden z operandów zwróci wartość true.
() Mechanizm grupowania, który ocenia true , czy wyrażenia zawarte wewnątrz funkcji oceniają wartość true.
$if$ ( %expression% ), $else$, $endif$ Sprawdza, czy określona %expression% wartość jest zgodna z wartością ciągu przekazanego parametru szablonu niestandardowego. $if$ Jeśli warunek daje wartość , jego instrukcje truesą uruchamiane. W przeciwnym razie $else$ warunek jest sprawdzany. $else$ Jeśli warunek ma truewartość , jego instrukcje są uruchamiane. W przeciwnym razie $endif$ warunek kończy ocenę wyrażenia.

Przykłady użycia można znaleźć w temacie Visual Studio project/item template parameter logic (Logika parametrów szablonu projektu/elementu programu Visual Studio).

Element Condition jest pojedynczym ciągiem, dlatego wszystkie ciągi, które są używane w wyrażeniu, w tym wokół wartości właściwości, muszą być ujęte w pojedynczy cudzysłów. Odstępy między operatorami są dozwolone i często używane do czytelności, ale nie są wymagane.

Aby użyć wartości logicznej And i Or operatorów, określ operandy wewnątrz Condition wartości ciągu elementu, jak w poniższym przykładzie:

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

Operatory logiczne można połączyć w łańcuch. Operator And ma wyższy priorytet niż Or, ale w celu zapewnienia przejrzystości zalecamy użycie nawiasów w przypadku użycia wielu operatorów logicznych w celu jawnego określenia kolejności oceny. Jeśli tego nie zrobisz, program MSBuild wyświetla ostrzeżenie MSB4130.

Metody ciągów można używać w warunkach, jak pokazano w poniższym przykładzie, w którym funkcja TrimEnd() jest używana do porównywania tylko odpowiedniej części ciągu, aby odróżnić platformy docelowe .NET Framework i .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>

W plikach projektu MSBuild nie ma prawdziwego typu logicznego. Dane logiczne są reprezentowane we właściwościach, które mogą być puste lub ustawione na dowolną wartość. W związku z tym oznacza "jeśli prop jest", '$(Prop)' == 'true' ale '$(Prop)' != 'false' oznacza "jeśli prop jest truetrue lub nie ustawiono lub ustawiono na coś innego".

Logika logiczna jest obliczana tylko w kontekście warunków, więc ustawienia właściwości, takie jak <Prop2>'$(Prop1)' == 'true'</Prop> są reprezentowane jako ciąg (po rozszerzeniu zmiennej), nie są oceniane jako wartości logiczne.

Program MSBuild implementuje kilka specjalnych reguł przetwarzania, aby ułatwić pracę z właściwościami ciągów, które są używane jako wartości logiczne. Literały logiczne są akceptowane, więc Condition="true" i Condition="false" działają zgodnie z oczekiwaniami. Program MSBuild zawiera również specjalne reguły do obsługi operatora negacji logicznej. $(Prop) Jeśli więc wartość ma wartość "true", !$(Prop) rozwija się do !true wartości , a ta wartość jest porównywana z falsewartością , jak można się spodziewać.

Porównywanie wersji

Operatory <relacyjne , >, <=i >= obsługują wersje analizowane przez System.Versionelement , dzięki czemu można porównać wersje, które mają cztery części liczbowe. Na przykład '1.2.3.4' < '1.10.0.0' to true.

Uwaga

System.Version porównania mogą powodować zaskakujące wyniki, gdy jedna lub obie wersje nie określają wszystkich czterech części. Na przykład wersja 1.1 jest starsza niż wersja 1.1.0.

Program MSBuild udostępnia funkcje właściwości do porównywania wersji , które mają inny zestaw reguł zgodnych z semantycznym przechowywaniem wersji (semver).

Rozszerzenia w warunkach

W zależności od pozycji w pliku projektu można użyć rozszerzeń dla właściwości ($), list elementów (@) i metadanych elementu (%). Rozszerzenia zależą od sposobu przetwarzania plików projektu przez program MSBuild.

Właściwości

Warunek zawierający wyrażenie, takie jak $(SomeProperty) , jest obliczany i konwertowany na wartość właściwości. Jeśli warunek znajduje się poza elementem docelowym, wyrażenie jest obliczane podczas oceny pliku projektu. Wartość właściwości zależy od pozycji w pliku projektu po rozwinięciu wszystkich importów. Jeśli warunek znajduje się w elemecie docelowym, jest obliczany podczas wykonywania obiektu docelowego, a wartość ma wpływ na wszelkie zmiany, które występują podczas wykonywania kompilacji.

Właściwość, która nie jest zdefiniowana w punkcie rozwiniętego pliku projektu, w którym wyrażenie warunku jest obliczane na pusty ciąg bez żadnego błędu diagnostycznego lub ostrzeżenia.

Listy elementów

Warunek zawierający wyrażenie @,takie jak @(SomeItems) jest rozwinięty w grupach elementów na najwyższym poziomie i w elementach docelowych.

Elementy mogą zależeć od dowolnej właściwości i mogą zależeć od elementów, które są już zdefiniowane w sekwencji.

Przyczyną jest to, że program MSBuild przetwarza pliki projektu w kilku przebiegach. Ocena elementu jest wykonywana po początkowym przeprowadzeniu oceny właściwości i przekazaniu rozszerzenia importu. W związku z tym wyrażenia @-są dozwolone w każdym warunku, który jest obliczany po rozpoczęciu definiowania elementów. Oznacza to, że w elementach, grupach elementów i elementach docelowych.

Metadane

Warunek zawierający wyrażenie metadanych, takie jak %(ItemMetadata) , jest rozwinięty w tych samych kontekstach co listy elementów, czyli w grupach elementów na najwyższym poziomie i w elementach docelowych. Jednak rozszerzenie może mieć inne zachowanie w grupie elementów w zależności od tego, czy grupa elementów znajduje się poza elementem docelowym, czy wewnątrz elementu docelowego. Ponadto różne formy wyrażeń metadanych, %(ItemName.MetadataName), %(JustTheMetadataName)i @(ItemName->'%(MetadataName)'), tylko przekształcenie elementu (ostatnie) jest dozwolone poza obiektem docelowym. Wartość wyrażenia %-w obiekcie docelowym jest obliczana w czasie wykonywania i zależy od wszelkich zmian stanu podczas wykonywania docelowego. Wykonanie obiektu docelowego i wartość dowolnych wyrażeń %-zawartych w nim zależy również od dzielenia na partie obiektu docelowego i może również wyzwalać przetwarzanie wsadowe; zobacz Przetwarzanie wsadowe programu MSBuild.

Obsługiwane elementy

Następujące elementy obsługują Condition atrybut:

  • Importuj
  • ImportGroup
  • Towar
  • ItemDefinitionGroup
  • Grupa elementów
  • ItemMetadata
  • OnError
  • Wyjście
  • Właściwości
  • PropertyGroup
  • Obiekt docelowy
  • Zadanie
  • UsingTask
  • Kiedy

Zobacz też