Aracılığıyla paylaş


Özellikleri ve öğeleri karşılaştırma

MSBuild özellikleri ve öğeleri görevlere bilgi geçirmek, koşulları değerlendirmek ve proje dosyası boyunca başvurulabilecek değerleri depolamak için kullanılır.

  • Özellikler ad-değer çiftleridir. Daha fazla bilgi için bkz . MSBuild özellikleri.

  • Öğeler genellikle dosyaları temsil eden nesnelerdir. Öğe nesnelerinin ilişkili meta veri koleksiyonları olabilir. Meta veriler ad-değer çiftleridir. Daha fazla bilgi için bkz . Öğeler.

Skalerler ve vektörler

MSBuild özellikleri yalnızca bir dize değerine sahip ad-değer çiftleri olduğundan, bunlar genellikle skaler olarak tanımlanır. MSBuild öğe türleri öğe listeleri olduğundan, bunlar genellikle vektör olarak tanımlanır. Ancak, uygulamada özellikler birden çok değeri temsil edebilir ve öğe türlerinin sıfır veya bir öğesi olabilir.

Hedef bağımlılık ekleme

Özelliklerin birden çok değeri nasıl gösterebileceğini görmek için, oluşturulacak hedefler listesine hedef eklemeye yönelik yaygın kullanım desenini göz önünde bulundurun. Bu liste genellikle hedef adları noktalı virgülle ayrılmış bir özellik değeriyle temsil edilir.

<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>

BuildDependsOn özelliği genellikle bir hedef DependsOnTargets özniteliğin bağımsız değişkeni olarak kullanılır ve bunu etkili bir şekilde öğe listesine dönüştürür. Bu özellik, hedef eklemek veya hedef yürütme sırasını değiştirmek için geçersiz kılınabilir. Örneğin:

<PropertyGroup>
    <BuildDependsOn>
        $(BuildDependsOn);
        CustomBuild;
    </BuildDependsOn>
</PropertyGroup>

CustomBuild hedefini hedef listeye ekler ve değerini BeforeBuild;CoreBuild;AfterBuild;CustomBuildverirBuildDependsOn.

MSBuild 4.0'dan başlayarak hedef bağımlılık ekleme kullanım dışıdır. AfterTargets Bunun yerine ve BeforeTargets özniteliklerini kullanın. Daha fazla bilgi için bkz . Hedef derleme sırası.

Dizeler ve öğe listeleri arasındaki dönüştürmeler

MSBuild, öğe türlerine ve dize değerlerine dönüştürmeleri gerektiği gibi gerçekleştirir. Bir öğe listesinin nasıl dize değeri haline gelebileceğini görmek için, bir öğe türü BIR MSBuild özelliğinin değeri olarak kullanıldığında ne olacağını göz önünde bulundurun:

<ItemGroup>
    <OutputDir Include="KeyFiles\;Certificates\" />
</ItemGroup>
<PropertyGroup>
    <OutputDirList>@(OutputDir)</OutputDirList>
</PropertyGroup>

OutputDir Include öğe türünün "KeyFiles\; Sertifikalar\". MSBuild bu dizeyi iki öğeye ayrıştırıyor: KeyFiles\ ve Certificates\. OutputDirlist özelliğinin değeri olarak OutputDir öğesi türü kullanıldığında, MSBuild öğe türünü "KeyFiles\; noktalı virgülle ayrılmış dizeye dönüştürür veya "düzleştirir"; Sertifikalar\".

Görevlerdeki özellikler ve öğeler

Özellikler ve öğeler, MSBuild görevlerine giriş ve çıkış olarak kullanılır. Daha fazla bilgi için bkz . Görevler.

Özellikler görevlere öznitelik olarak geçirilir. Görev içinde, bir MSBuild özelliği, değeri bir dizeye ve dizeden dönüştürülebilen bir özellik türüyle temsil edilir. Desteklenen özellik türleri , , char, DateTime, Decimal, Double, intstringve işleyebilen ChangeType herhangi bir tür içerirbool.

Öğeler görevlere nesne olarak ITaskItem geçirilir. Görev içinde öğenin ItemSpec değerini temsil eder ve GetMetadata meta verilerini alır.

Öğe türünün öğe listesi bir nesne dizisi ITaskItem olarak geçirilebilir. .NET Framework 3.5'ten başlayarak, öğeler özniteliği kullanılarak hedefteki öğe listesinden Remove kaldırılabilir. Öğeler öğe listesinden kaldırılabildiğinden, öğe türünün sıfır öğeye sahip olması mümkündür. Bir öğe listesi göreve geçirilirse, görevdeki kod bu olasılığı denetlemelidir.

Özellik ve öğe değerlendirme sırası

Derlemenin değerlendirme aşamasında içeri aktarılan dosyalar, göründükleri sırayla derlemeye eklenir. Özellikler ve öğeler aşağıdaki sırayla üç geçişle tanımlanır:

  • Özellikler, göründükleri sırayla tanımlanır ve değiştirilir.

  • Öğe tanımları, göründükleri sırayla tanımlanır ve değiştirilir.

  • Öğeler, göründükleri sırayla tanımlanır ve değiştirilir.

Bir derlemenin yürütme aşamasında, hedefler içinde tanımlanan özellikler ve öğeler, göründükleri sırayla tek bir aşamada birlikte değerlendirilir.

Ancak, hikayenin tamamı bu değildir. Bir özellik, öğe tanımı veya öğe tanımlandığında değeri değerlendirilir. İfade değerlendirici değeri belirten dizeyi genişletir. Dize genişletme, derleme aşamasına bağlıdır. Daha ayrıntılı bir özellik ve öğe değerlendirme sırası aşağıdadır:

  • Derlemenin değerlendirme aşamasında:

    • Özellikler, göründükleri sırayla tanımlanır ve değiştirilir. Özellik işlevleri yürütülür. $(PropertyName) biçimindeki özellik değerleri ifadeler içinde genişletilir. Özellik değeri genişletilmiş ifadeye ayarlanır.

    • Öğe tanımları, göründükleri sırayla tanımlanır ve değiştirilir. Özellik işlevleri ifadeler içinde zaten genişletilmiştir. Meta veri değerleri genişletilmiş ifadelere ayarlanır.

    • Öğe türleri, göründükleri sırayla tanımlanır ve değiştirilir. @(ItemType) biçimindeki öğe değerleri genişletilir. Öğe dönüştürmeleri de genişletilir. Özellik işlevleri ve değerleri ifadeler içinde zaten genişletilmiştir. Öğe listesi ve meta veri değerleri genişletilmiş ifadelere ayarlanır.

  • Derlemenin yürütme aşamasında:

    • Hedefler içinde tanımlanan özellikler ve öğeler, göründükleri sırayla birlikte değerlendirilir. Özellik işlevleri yürütülür ve özellik değerleri ifadeler içinde genişletilir. Öğe değerleri ve öğe dönüştürmeleri de genişletilir. Özellik değerleri, öğe türü değerleri ve meta veri değerleri genişletilmiş ifadelere ayarlanır.

Değerlendirme sırasının hafif etkileri

Derlemenin değerlendirme aşamasında, özellik değerlendirmesi öğe değerlendirmeden önce getirilir. Bununla birlikte, özellikler öğe değerlerine bağlı olarak görünen değerlere sahip olabilir. Aşağıdaki betiği göz önünde bulundurun.

<ItemGroup>
    <KeyFile Include="KeyFile.cs">
        <Version>1.0.0.3</Version>
    </KeyFile>
</ItemGroup>
<PropertyGroup>
    <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<Target Name="AfterBuild">
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

İleti görevi yürütülürken şu ileti görüntülenir:

KeyFileVersion: 1.0.0.3

Bunun nedeni değerinin KeyFileVersion aslında "@(KeyFile->'%(Sürüm)')" dizesi olmasıdır. Özellik ilk tanımlandığında öğe ve öğe dönüştürmeleri genişletilmediğinden, KeyFileVersion özelliğe genişletilmemiş dizenin değeri atanmıştır.

Derlemenin yürütme aşamasında, İleti görevini işlerken, MSBuild "@(KeyFile->'%(Sürüm)')" dizesini "1.0.0.3" verimine genişletir.

Özellik ve öğe grupları sırayla ters çevrilse bile aynı iletinin görüneceğine dikkat edin.

İkinci bir örnek olarak, özellik ve öğe grupları hedeflerin içinde bulunduğunda neler olabileceğini göz önünde bulundurun:

<Target Name="AfterBuild">
    <PropertyGroup>
        <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
    </PropertyGroup>
    <ItemGroup>
        <KeyFile Include="KeyFile.cs">
            <Version>1.0.0.3</Version>
        </KeyFile>
    </ItemGroup>
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

İleti görevi şu iletiyi görüntüler:

KeyFileVersion:

Bunun nedeni, derlemenin yürütme aşamasında, hedefler içinde tanımlanan özellik ve öğe gruplarının aynı anda yukarıdan aşağıya doğru değerlendirilmesidir. Tanımlandığında KeyFileVersion KeyFile bilinmez. Bu nedenle, öğe dönüşümü boş bir dizeye genişletir.

Bu durumda, özellik ve öğe gruplarının sırasının tersine döndürülmesi özgün iletiyi geri yükler:

<Target Name="AfterBuild">
    <ItemGroup>
        <KeyFile Include="KeyFile.cs">
            <Version>1.0.0.3</Version>
        </KeyFile>
    </ItemGroup>
    <PropertyGroup>
        <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
    </PropertyGroup>
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

değeri KeyFileVersion "1.0.0.3" olarak ayarlanır ve "@(KeyFile->'%(Sürüm)')"olarak ayarlanmaz. İleti görevi şu iletiyi görüntüler:

KeyFileVersion: 1.0.0.3