Sdílet prostřednictvím


Porovnání vlastností a položek

Vlastnosti nástroje MSBuild a položky slouží k předávání informací úkolům, vyhodnocení podmínek a ukládání hodnot, na které lze odkazovat v celém souboru projektu.

  • Vlastnosti jsou páry name-value. Další informace naleznete v tématu MSBuild vlastnosti.

  • Položky jsou objekty, které obvykle představují soubory. Objekty položek můžou mít přidružené kolekce metadat. Metadata jsou páry name-value. Další informace naleznete v tématu Položky.

Skaláry a vektory

Vzhledem k tomu, že vlastnosti NÁSTROJE MSBuild jsou páry name-value, které mají pouze jednu řetězcovou hodnotu, jsou často popsány jako skalární. Vzhledem k tomu, že typy položek NÁSTROJE MSBuild jsou seznamy položek, jsou často popsány jako vektor. V praxi však mohou vlastnosti představovat více hodnot a typy položek mohou mít nula nebo jednu položku.

Injektáž cílových závislostí

Pokud chcete zjistit, jak můžou vlastnosti představovat více hodnot, zvažte běžný způsob použití pro přidání cíle do seznamu cílů, které se mají sestavit. Tento seznam je obvykle reprezentován hodnotou vlastnosti s cílovými názvy oddělenými středníky.

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

Vlastnost BuildDependsOn se obvykle používá jako argument cílového DependsOnTargets atributu a efektivně ji převádí na seznam položek. Tuto vlastnost lze přepsat přidáním cíle nebo změnou pořadí provádění cíle. Příklad:

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

přidá cíl CustomBuild do cílového seznamu a dává BuildDependsOn hodnotu BeforeBuild;CoreBuild;AfterBuild;CustomBuild.

Počínaje verzí MSBuild 4.0 je injektáž cílových závislostí zastaralá. AfterTargets Místo toho použijte atributy a BeforeTargets atributy. Další informace najdete v tématu Pořadí cílového sestavení.

Převody mezi řetězci a seznamy položek

Nástroj MSBuild provádí převody na a z typů položek a řetězcových hodnot podle potřeby. Pokud chcete zjistit, jak se seznam položek může stát řetězcovou hodnotou, zvažte, co se stane, když se typ položky použije jako hodnota vlastnosti MSBuild:

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

Typ položky OutputDir má Include atribut s hodnotou KeyFiles\; Certifikáty\". Nástroj MSBuild analyzuje tento řetězec do dvou položek: KeyFiles\ a Certificates\. Pokud je typ položky OutputDir použit jako hodnota OutputDirList vlastnost, MSBuild převede nebo "flattens" typ položky na středník-oddělený řetězec "KeyFiles\; Certifikáty\".

Vlastnosti a položky v úkolech

Vlastnosti a položky se používají jako vstupy a výstupy úloh NÁSTROJE MSBuild. Další informace najdete v tématu Úkoly.

Vlastnosti se předávají úkolům jako atributy. V rámci úkolu je vlastnost MSBuild reprezentována typem vlastnosti, jejíž hodnotu lze převést na řetězec a z řetězce. Mezi podporované typy vlastností patří bool, , DateTimeDoubleDecimalintchar, stringa libovolný typ, který ChangeType dokáže zpracovat.

Položky se předávají úkolům jako ITaskItem objekty. V rámci úkolu ItemSpec představuje hodnotu položky a GetMetadata načte její metadata.

Seznam položek typu položky lze předat jako pole ITaskItem objektů. Počínaje rozhraním .NET Framework 3.5 lze položky odebrat ze seznamu položek v cíli pomocí atributu Remove . Vzhledem k tomu, že položky lze ze seznamu položek odebrat, je možné, aby typ položky měl nulovou hodnotu. Pokud je seznam položek předán úkolu, měl by kód v úkolu zkontrolovat tuto možnost.

Pořadí vyhodnocení vlastností a položek

Během fáze vyhodnocení sestavení se importované soubory začlení do sestavení v pořadí, ve kterém se zobrazí. Vlastnosti a položky jsou definovány ve třech průchodech v následujícím pořadí:

  • Vlastnosti jsou definovány a upraveny v pořadí, ve kterém se zobrazují.

  • Definice položek jsou definovány a upraveny v pořadí, ve kterém se zobrazují.

  • Položky jsou definovány a upraveny v pořadí, ve kterém se zobrazují.

Během fáze provádění sestavení se vlastnosti a položky definované v rámci cílů vyhodnocují společně v jedné fázi v pořadí, ve kterém se zobrazují.

To ale není celý příběh. Při definování vlastnosti, definice položky nebo položky se vyhodnotí její hodnota. Vyhodnocovač výrazů rozšiřuje řetězec, který určuje hodnotu. Rozšíření řetězce závisí na fázi sestavení. Tady je podrobnější vlastnost a pořadí vyhodnocení položky:

  • Během fáze vyhodnocení sestavení:

    • Vlastnosti jsou definovány a upraveny v pořadí, ve kterém se zobrazují. Spouští se funkce vlastností. Hodnoty vlastností ve formuláři $(PropertyName) jsou rozbalené ve výrazech. Hodnota vlastnosti je nastavena na rozbalený výraz.

    • Definice položek jsou definovány a upraveny v pořadí, ve kterém se zobrazují. Funkce vlastností již byly v rámci výrazů rozšířeny. Hodnoty metadat jsou nastaveny na rozšířené výrazy.

    • Typy položek jsou definovány a upraveny v pořadí, ve kterém se zobrazují. Hodnoty položek ve formuláři @(ItemType) jsou rozbalené. Transformace položek jsou také rozbalené. Funkce a hodnoty vlastností již byly v rámci výrazů rozšířeny. Hodnoty seznamu položek a metadat jsou nastaveny na rozšířené výrazy.

  • Během fáze provádění sestavení:

    • Vlastnosti a položky definované v rámci cílů se vyhodnocují společně v pořadí, ve kterém se zobrazují. Funkce vlastností se spouštějí a hodnoty vlastností se v rámci výrazů rozbalí. Hodnoty položek a transformace položek jsou také rozbalené. Hodnoty vlastností, hodnoty typu položky a hodnoty metadat jsou nastaveny na rozšířené výrazy.

Jemné účinky pořadí vyhodnocení

Ve fázi vyhodnocení sestavení předchází vyhodnocení vlastnosti vyhodnocení položky. Vlastnosti však mohou mít hodnoty, které se jeví jako závislé na hodnotách položky. Zvažte následující skript.

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

Při spuštění úlohy Zpráva se zobrazí tato zpráva:

KeyFileVersion: 1.0.0.3

Je to proto, že hodnota KeyFileVersion je ve skutečnosti řetězec @(KeyFile->'%(Version)')". Transformace položek a položek nebyly při prvním definování vlastnosti rozbalené, takže KeyFileVersion vlastnost byla přiřazena hodnota nevyexpandovaného řetězce.

Během fáze provádění sestavení, když zpracovává úlohu Zprávy, NÁSTROJ MSBuild rozbalí řetězec @(KeyFile->'%(Verze)') a vrátí hodnotu 1.0.0.3.

Všimněte si, že stejná zpráva by se zobrazila i v případě, že byly skupiny vlastností a položek v pořadí obrácené.

Jako druhý příklad zvažte, co se může stát, když se skupiny vlastností a položek nacházejí v rámci cílů:

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

Úkol Zpráva zobrazí tuto zprávu:

KeyFileVersion:

Důvodem je to, že během fáze provádění sestavení, skupiny vlastností a položek definované v rámci cílů se vyhodnocují shora dolů ve stejnou dobu. Je-li KeyFileVersion definován, KeyFile je neznámý. Transformace položky se proto rozšíří na prázdný řetězec.

V takovém případě obnovíte původní zprávu vrácením pořadí skupin vlastností a položek:

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

Hodnota KeyFileVersion je nastavena na 1.0.0.3 a nikoli na @(KeyFile->'%(Verze)')". Úkol Zpráva zobrazí tuto zprávu:

KeyFileVersion: 1.0.0.3