MSBuild koşulları

MSBuild, bir özniteliğe izin verilen her yerde uygulanabilecek belirli bir Condition koşul kümesini destekler; bkz . Desteklenen öğeler. Aşağıdaki tabloda bu koşullar açıklanmaktadır.

Koşul Açıklama
'stringA' == 'stringB' true değerine eşitse stringAstringBdeğerini değerlendirir.

Örneğin:

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

Basit alfasayısal dizeler veya boole değerleri için tek tırnak işareti gerekmez. Ancak boş değerler için tek tırnak işareti gerekir. Bu denetim büyük/küçük harfe duyarlı değildir.
'stringA' != 'stringB' true değerine eşit stringBdeğilse stringA olarak değerlendirilir.

Örneğin:

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

Basit alfasayısal dizeler veya boole değerleri için tek tırnak işareti gerekmez. Ancak boş değerler için tek tırnak işareti gerekir. Bu denetim büyük/küçük harfe duyarlı değildir.
<, >, <=, >= İşlenenlerin sayısal değerlerini değerlendirir. İlişkisel değerlendirme doğruysa döndürür true . İşlenenler ondalık veya onaltılık sayı ya da dört bölümlü noktalı sürüm olarak değerlendirilmelidir. Onaltılık sayılar ile 0xbaşlamalıdır. Not: XML'de ve karakterlerinin >< kaçış karakteri olmalıdır. Simgesi < olarak &lt;temsil edilir. Simgesi > olarak &gt;temsil edilir.
Var('stringA') true Adlı stringA bir dosya veya klasörün mevcut olup olmadığını değerlendirir.

Örneğin:

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

Basit alfasayısal dizeler veya boole değerleri için tek tırnak işareti gerekmez. Ancak boş değerler için tek tırnak işareti gerekir. Bu koşul gibi *joker karakterleri genişletmez.
HasTrailingSlash('stringA') true Belirtilen dizede sondaki bir ters eğik çizgi (\) veya eğik çizgi (/) karakteri olup olmadığını değerlendirir.

Örneğin:

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

Basit alfasayısal dizeler veya boole değerleri için tek tırnak işareti gerekmez. Ancak boş değerler için tek tırnak işareti gerekir.
! true İşlenenin olarak değerlendirilip değerlendirilmediğini değerlendirirfalse.
And true her iki işlenenin de olarak değerlendirilip değerlendirilmediğini değerlendirirtrue.
Or İşlenenlerden true en az birinin olarak değerlendirip değerlendirmediğini değerlendirir true.
() İçinde yer alan ifadelerin true olarak değerlendirilip değerlendirilmediğini değerlendiren truegruplandırma mekanizması.
$if$ ( %expression% ), $else$, $endif$ Belirtilen %expression% değerin geçirilen özel şablon parametresinin dize değeriyle eşleşip eşleşmediğini denetler. $if$ Koşul olarak değerlendirilirsetrue, deyimleri çalıştırılır; aksi takdirde koşul $else$ denetlenirse. $else$ Koşul ise truedeyimleri çalıştırılır; aksi takdirde koşul ifade değerlendirmesini $endif$ sonlandırır.

Kullanım örnekleri için bkz . Visual Studio proje/öğe şablonu parametre mantığı.

işlecinden And daha Oryüksek önceliğe sahiptir, ancak netlik için, değerlendirme sırasını açık hale getirmek için birden çok Boole işleci kullanırken parantezler kullanmanızı öneririz. Aksi takdirde MSBuild MSB4130 uyarı verir.

Aşağıdaki örnekte gösterildiği gibi, .NET Framework ile .NET Core hedef çerçeveleri arasında ayrım yapmak için dizenin yalnızca ilgili bölümünü karşılaştırmak için TrimEnd() işlevinin kullanıldığı koşullarda dize yöntemlerini kullanabilirsiniz.

<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>

MSBuild proje dosyalarında gerçek Boole türü yoktur. Boole verileri boş veya herhangi bir değere ayarlanmış özelliklerde temsil edilir. Bu nedenle, '$(Prop)' == 'true' "Prop ise true" anlamına gelir, ancak '$(Prop)' != 'false' "Prop true başka bir şeye ayarlanmışsa veya ayarlıysa" anlamına gelir.

Boole mantığı yalnızca koşullar bağlamında değerlendirilir, bu nedenle gibi <Prop2>'$(Prop1)' == 'true'</Prop> özellik ayarları bir dize olarak temsil edilir (değişken genişletmeden sonra), Boole değerleri olarak değerlendirilmez.

MSBuild, Boole değerleri olarak kullanılan dize özellikleriyle çalışmayı kolaylaştırmak için birkaç özel işleme kuralı uygular. Boole değişmez değerleri kabul edilir Condition="true" ve Condition="false" beklendiği gibi çalışır. MSBuild ayrıca Boole olumsuzlama işlecini desteklemek için özel kurallar içerir. Bu nedenle , 'true' ise $(Prop) , !$(Prop) olarak genişletilir !true ve bu değer beklediğiniz gibi değerine eşit falseolur.

Sürümleri karşılaştırma

İlişkisel işleçler <, >, <=ve >= tarafından ayrıştırılan System.Versionsürümleri destekler, böylece dört sayısal bölümü olan sürümleri birbiriyle karşılaştırabilirsiniz. Örneğin, '1.2.3.4' < '1.10.0.0' şeklindedir true.

Dikkat

System.Version karşılaştırmaları, bir veya her iki sürüm de dört bölümün tümünü belirtmediğinde şaşırtıcı sonuçlara neden olabilir. Örneğin, sürüm 1.1 sürüm 1.1.0'dan daha eskidir.

MSBuild, anlamsal sürüm oluşturma (semver) ile uyumlu farklı bir kural kümesine sahip sürümleri karşılaştırmak için özellik işlevleri sağlar.

Koşullarda genişletmeler

Proje dosyasındaki konuma bağlı olarak, özellikler ($), öğe listeleri (@) ve öğe meta verileri (%) için genişletmeleri kullanabilirsiniz. Genişletmeler, MSBuild'in proje dosyalarını nasıl işlediğine bağlıdır.

Özellikler

gibi $(SomeProperty) bir ifade içeren koşul değerlendirilir ve özellik değerine dönüştürülür. Koşul bir hedefin dışındaysa, ifade proje dosyasının değerlendirmesi sırasında değerlendirilir. özelliğinin değeri, tüm içeri aktarmalar genişletildikten sonra proje dosyasındaki konuma bağlıdır. Koşul bir hedefteyse, hedef yürütülürken değerlendirilir ve değer derlemenin yürütülmesi sırasında gerçekleşen değişikliklerden etkilenir.

Genişletilmiş proje dosyasında koşul ifadesinin oluştuğu noktada tanımlanmayan bir özellik, herhangi bir tanılama hatası veya uyarı olmadan boş bir dize olarak değerlendirilir.

Öğe listeleri

gibi @(SomeItems) bir @-ifade içeren koşul, en üst düzeydeki ve hedeflerdeki öğe gruplarında genişletilir.

Öğeler herhangi bir özelliğe bağımlı olabilir ve sıralı olarak zaten tanımlanmış öğelere bağımlı olabilir.

Bunun nedeni, MSBuild'in proje dosyalarını birkaç geçişte işlemesidir. Öğe değerlendirme geçişi, ilk özellik değerlendirmesi ve içeri aktarma genişletme geçişi sonrasında gerçekleşir. Bu nedenle, öğeler tanımlanmaya başladıktan sonra değerlendirilen herhangi bir koşulda @-ifadelere izin verilir. Yani, öğelerde, öğe gruplarında ve hedeflerde.

Meta veri

gibi %(ItemMetadata) bir meta veri ifadesi içeren bir koşul, öğe listeleriyle aynı bağlamlarda, yani en üst düzeydeki öğe gruplarında ve hedeflerde genişletilir. Ancak, öğe grubunun hedefin dışında mı yoksa hedefin içinde mi olduğuna bağlı olarak, genişletmenin bir öğe grubunda farklı davranışları olabilir. Ayrıca, , ve @(ItemName->'%(MetadataName)')meta veri ifadelerinin çeşitli biçimlerinde%(ItemName.MetadataName)%(JustTheMetadataName), hedef dışında yalnızca öğe dönüşümüne (sonuncusu) izin verilir. Hedefteki bir %-ifadesinin değeri çalışma zamanında değerlendirilir ve hedef yürütme sırasındaki durum değişikliklerine bağlıdır. Hedefin yürütülmesi ve içindeki %-ifadelerin değeri de hedefin toplu işlemesine bağlıdır ve toplu işlemi tetikleyebilir; Bkz . MSBuild toplu işlemi.

Desteklenen öğeler

Aşağıdaki öğeler özniteliğini Condition destekler:

  • Import
  • ImportGroup
  • Madde
  • Itemdefinitiongroup
  • Itemgroup
  • ItemMetadata
  • Onerror
  • Çıktı
  • Özellik
  • Propertygroup
  • Hedef
  • Görev
  • Usingtask
  • Ne zaman

Ayrıca bkz.