Kondisi MSBuild

MSBuild mendukung serangkaian kondisi tertentu yang dapat diterapkan di mana pun Condition atribut diizinkan; lihat Elemen yang didukung. Tabel berikut menjelaskan kondisi tersebut.

Kondisi Deskripsi
'stringA' == 'stringB' Mengevaluasi ke true jika stringA sama dengan stringB.

Misalnya:

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

Tanda kutip tunggal tidak diperlukan untuk string alfanumerik sederhana atau nilai boolean. Namun, tanda kutip tunggal diperlukan untuk nilai kosong. Pemeriksaan ini tidak peka huruf besar/kecil.
'stringA' != 'stringB' Mengevaluasi ke true jika stringA tidak sama dengan stringB.

Misalnya:

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

Tanda kutip tunggal tidak diperlukan untuk string alfanumerik sederhana atau nilai boolean. Namun, tanda kutip tunggal diperlukan untuk nilai kosong. Pemeriksaan ini tidak peka huruf besar/kecil.
<, >, <=, >= Mengevaluasi nilai numerik operand. Mengembalikan true jika evaluasi relasional benar. Operan harus mengevaluasi ke angka desimal atau heksadesimal atau versi bertitik empat bagian. Angka heksadesimal harus dimulai dengan 0x. Catatan: Di XML, karakter < dan > harus dilewati. Simbol < direpresentasikan sebagai &lt;. Simbol > direpresentasikan sebagai &gt;.
Exists('stringA') Mengevaluasi ke true apakah ada file atau folder dengan nama stringA tersebut.

Misalnya:

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

Tanda kutip tunggal tidak diperlukan untuk string alfanumerik sederhana atau nilai boolean. Namun, tanda kutip tunggal diperlukan untuk nilai kosong. Kondisi ini tidak memperluas kartubebas seperti *.
HasTrailingSlash('stringA') Mengevaluasi ke true jika string yang ditentukan berisi karakter garis miring mundur (\) atau garis miring (/).

Misalnya:

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

Tanda kutip tunggal tidak diperlukan untuk string alfanumerik sederhana atau nilai boolean. Namun, tanda kutip tunggal diperlukan untuk nilai kosong.
! Mengevaluasi ke true jika operand mengevaluasi ke false.
And Mengevaluasi ke true apakah kedua operan mengevaluasi ke true.
Or Mengevaluasi ke true apakah setidaknya salah satu operand mengevaluasi ke true.
() Mekanisme pengelompokan yang mengevaluasi ke true apakah ekspresi yang terkandung di dalam mengevaluasi ke true.
$if$ ( %expression% ), $else$, $endif$ Memeriksa apakah yang ditentukan %expression% cocok dengan nilai string dari parameter templat kustom yang diteruskan. Jika $if$ kondisi mengevaluasi ke true, maka pernyataannya dijalankan; jika tidak, $else$ kondisi akan diperiksa. Jika $else$ kondisi mengevaluasi ke true, maka pernyataannya dijalankan; jika tidak, $endif$ kondisi akan diperiksa.

Untuk contoh penggunaan, lihat Visual Studio logika parameter templat proyek/item.

Operator And memiliki prioritas yang lebih tinggi daripada Or, tetapi untuk kejelasan, kami sarankan Anda menggunakan tanda kurung saat Anda menggunakan beberapa operator Boolean untuk membuat urutan evaluasi eksplisit. Jika tidak, MSBuild memberikan MSB4130 peringatan.

Anda dapat menggunakan metode string dalam kondisi, seperti yang ditunjukkan dalam contoh berikut, di mana fungsi TrimEnd() digunakan untuk membandingkan hanya bagian string yang relevan, untuk membedakan antara kerangka kerja target .NET Framework dan .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>

Dalam file proyek MSBuild, tidak ada jenis Boolean sejati. Data Boolean diwakili dalam properti yang mungkin kosong atau diatur ke nilai apa pun. Oleh karena itu, '$(Prop)' == 'true' berarti "jika Prop adalah true," tetapi '$(Prop)' != 'false' berarti "jika Prop atau true unset atau diatur ke sesuatu yang lain."

Logika Boolean hanya dievaluasi dalam konteks kondisi, sehingga pengaturan properti seperti <Prop2>'$(Prop1)' == 'true'</Prop> direpresentasikan sebagai string (setelah ekspansi variabel), tidak dievaluasi sebagai nilai Boolean.

MSBuild menerapkan beberapa aturan pemrosesan khusus untuk mempermudah bekerja dengan properti string yang digunakan sebagai nilai Boolean. Literal Boolean diterima, sehingga Condition="true" dan Condition="false" bekerja seperti yang diharapkan. MSBuild juga mencakup aturan khusus untuk mendukung operator negasi Boolean. Jadi, jika $(Prop) 'true', !$(Prop) meluas ke !true dan nilai ini dibandingkan dengan false, seperti yang Anda harapkan.

Membandingkan versi

Operator relasional <, >, <=, dan >= mendukung versi seperti yang diurai oleh System.Version, sehingga Anda dapat membandingkan versi yang memiliki empat bagian numerik satu sama lain. Misalnya, '1.2.3.4' < '1.10.0.0' adalah true.

Perhatian

System.Version perbandingan dapat menghasilkan hasil yang mengejutkan ketika satu atau kedua versi tidak menentukan keempat bagian. Misalnya, versi 1.1 lebih lama dari versi 1.1.0.

MSBuild menyediakan fungsi properti untuk membandingkan versi yang memiliki serangkaian aturan berbeda yang kompatibel dengan penerapan versi semantik (semver).

Ekspansi dalam kondisi

Bergantung pada posisi dalam file proyek, Anda dapat menggunakan ekspansi untuk properti ($), daftar item (@), dan metadata item (%). Ekspansi tergantung pada cara MSBuild memproses file proyek.

Properti

Kondisi yang berisi ekspresi seperti $(SomeProperty) dievaluasi dan dikonversi ke nilai properti. Jika kondisi berada di luar target, ekspresi dievaluasi selama evaluasi file proyek. Nilai properti tergantung pada posisi dalam file proyek setelah memperluas semua impor. Jika kondisi berada dalam target, maka akan dievaluasi ketika target dijalankan, dan nilainya dipengaruhi oleh perubahan apa pun yang terjadi selama eksekusi build.

Properti yang tidak ditentukan pada titik dalam file proyek yang diperluas di mana ekspresi kondisi terjadi mengevaluasi ke string kosong, tanpa kesalahan atau peringatan diagnostik.

Daftar item

Kondisi yang berisi @-expression seperti @(SomeItems) diperluas dalam grup item di tingkat atas dan dalam target.

Item dapat bergantung pada properti apa pun, dan dapat bergantung pada item yang sudah ditentukan secara berurutan.

Alasannya adalah bahwa MSBuild memproses file proyek dalam beberapa pass. Pass evaluasi item terjadi setelah evaluasi properti awal dan izin ekspansi impor. Oleh karena itu, @-expressions diizinkan dalam kondisi apa pun yang dievaluasi setelah item mulai ditentukan. Yaitu, dalam item, grup item, dan dalam target.

Metadata

Kondisi yang berisi ekspresi metadata seperti %(ItemMetadata) diperluas dalam konteks yang sama dengan daftar item, yaitu, dalam grup item di tingkat atas dan dalam target. Namun, ekspansi dapat memiliki perilaku yang berbeda dalam grup item tergantung pada apakah grup item berada di luar target atau di dalam target. Selain itu, dari berbagai bentuk ekspresi metadata, , %(ItemName.MetadataName), %(JustTheMetadataName)dan @(ItemName->'%(MetadataName)'), hanya transformasi item (yang terakhir) yang diizinkan di luar target. Nilai %-expression dalam target dievaluasi pada run-time dan bergantung pada perubahan status apa pun selama eksekusi target. Eksekusi target dan nilai %-expression apa pun yang terkandung di dalamnya juga bergantung pada batching target dan juga dapat memicu batching; lihat Batching MSBuild.

Elemen yang didukung

Elemen berikut mendukung Condition atribut :

  • Import
  • ImportGroup
  • Item
  • ItemDefinitionGroup
  • ItemGroup
  • ItemMetadata
  • OnError
  • Hasil
  • Properti
  • PropertyGroup
  • Target
  • Task
  • UsingTask
  • Kapan

Baca juga