Utiliser des fonctions d’élément
Le code dans les tâches et les cibles peut appeler des fonctions d’élément pour obtenir des informations sur les éléments du projet (dans MSBuild 4.0 et versions ultérieures). Ces fonctions simplifient l'obtention d'éléments distincts et sont plus rapides que de faire une boucle à travers les éléments.
Fonctions d’élément de chaîne
Vous pouvez utiliser des méthodes et des propriétés de chaîne dans .NET Framework pour fonctionner sur n’importe quelle valeur d’élément. Pour String méthodes, spécifiez le nom de la méthode. Pour les propriétés String, spécifiez le nom de la propriété après le terme « get_ ».
Pour les éléments qui ont plusieurs chaînes, la méthode ou la propriété de chaîne s’exécute sur chaque chaîne.
L’exemple suivant montre comment utiliser ces fonctions d’élément de chaîne.
<ItemGroup>
<theItem Include="andromeda;tadpole;cartwheel" />
</ItemGroup>
<Target Name = "go">
<Message Text="IndexOf @(theItem->IndexOf('r'))" />
<Message Text="Replace @(theItem->Replace('tadpole', 'pinwheel'))" />
<Message Text="Length @(theItem->get_Length())" />
<Message Text="Chars @(theItem->get_Chars(2))" />
</Target>
<!--
Output:
IndexOf 3;-1;2
Replace andromeda;pinwheel;cartwheel
Length 9;7;9
Chars d;d;r
-->
Fonctions d’élément intrinsèques
Le tableau ci-dessous répertorie les fonctions intrinsèques disponibles pour les éléments.
Fonction | Exemple | Description |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Retourne un nouvel ensemble d’éléments avec un chemin relatif donné ajouté à tous les éléments d’entrée. |
Count |
@(MyItems->Count()) |
Retourne le nombre d’éléments. |
DirectoryName |
@(MyItems->DirectoryName()) |
Retourne l’équivalent de Path.DirectoryName pour chaque élément. |
Distinct |
@(MyItems->Distinct()) |
Retourne des éléments qui ont des valeurs Include distinctes. Les métadonnées sont ignorées. La comparaison est insensible à la casse. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
Retourne les éléments ayant des valeurs itemspec distinctes. Les métadonnées sont ignorées. La comparaison respecte la casse. |
Exists |
@(MyItems->Exists()) |
Filtre un ensemble d’éléments sur ceux qui existent réellement sur le disque. |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
Étant donné un ensemble d’éléments, retourne des éléments représentant tous les répertoires ancêtres. Aucune commande n’est garantie. |
Reverse |
@(MyItems->Reverse()) |
Retourne les éléments dans l’ordre inverse. |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
Retourne un boolean pour indiquer si un élément a le nom et la valeur des métadonnées donnés. La comparaison est insensible à la casse. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Retourne des éléments avec leurs métadonnées effacées. Seule la itemspec est conservée. |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
Retourne les éléments qui ont le nom de métadonnées donné. La comparaison ne tient pas compte de la casse. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
Retourne les valeurs des métadonnées ayant pour nom le nom de métadonnées. Les éléments retournés ont les mêmes métadonnées que les valeurs sources. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
Retourne les éléments qui ont le nom et la valeur des métadonnées donnés. La comparaison est insensible à la casse. |
Note
Exists
peut également être utilisé dans d’autres contextes : dans les conditions MSBuild, par exemple Condition="Exists('path')"
, ou dans les fonctions de propriété statique, par exemple $([System.IO.File]::Exists("path"))
.
L’exemple suivant montre comment utiliser des fonctions d’élément intrinsèques.
<ItemGroup>
<TheItem Include="first">
<Plant>geranium</Plant>
</TheItem>
<TheItem Include="second">
<Plant>algae</Plant>
</TheItem>
<TheItem Include="third">
<Plant>geranium</Plant>
</TheItem>
</ItemGroup>
<Target Name="go">
<Message Text="MetaData: @(TheItem->Metadata('Plant'))" />
<Message Text="HasMetadata: @(theItem->HasMetadata('Plant'))" />
<Message Text="WithMetadataValue: @(TheItem->WithMetadataValue('Plant', 'geranium'))" />
<Message Text=" " />
<Message Text="Count: @(theItem->Count())" />
<Message Text="Reverse: @(theItem->Reverse())" />
</Target>
<!--
Output:
MetaData: geranium;algae;geranium
HasMetadata: first;second;third
WithMetadataValue: first;third
Count: 3
Reverse: third;second;first
-->
Appel d’une méthode String
Si une fonction d’élément n’est pas disponible qui correspond à votre scénario, vous pouvez obtenir un effet similaire en créant un objet de chaîne à partir des métadonnées à l’aide de la fonction de propriété new
et appelez une méthode String
sur celle-ci. Par exemple, le code suivant utilise une recherche de sous-chaîne pour filtrer une liste d’éléments dans une cible.
<Project>
<PropertyGroup>
<SearchString>abc</SearchString>
</PropertyGroup>
<ItemGroup>
<UnfilteredList Include="abcdef;abc;def;xyz"></UnfilteredList>
</ItemGroup>
<Target Name="FilterItemList">
<ItemGroup>
<FilteredList Include="@(UnfilteredList)" Condition="$([System.String]::new('%(UnfilteredList.Identity)').Contains($(SearchString)))"></FilteredList>
</ItemGroup>
<Message Text="Result: @(FilteredList)"/>
</Target>
</Project>
Détection des doublons lors de l’utilisation de la fonction d’élément de métadonnées
La fonction d’élément Metadata
conserve les métadonnées d’origine des éléments sources. Cela a des implications lorsque vous déterminez si les éléments retournés sont des doublons ou non. Pour contrôler la façon dont les éléments dupliqués sont gérés, vous pouvez utiliser l’attribut KeepDuplicates. Vous pouvez également supprimer les métadonnées, si ce n’est pas nécessaire, en ajoutant la RemoveMetadata, auquel cas seules les valeurs elles-mêmes sont prises en compte lors de la détection des doublons.
<Target Name="MetadataToItem">
<ItemGroup>
<Sample Include="AAA" SomeItems="1;2;3" />
<Sample Include="BBB" SomeItems="3;4;5" />
</ItemGroup>
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" />
</ItemGroup>
<Message Text="AllSomeItems is @(AllSomeItems)" />
</Target>
La sortie est la suivante :
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
La modification suivante apportée au code entraîne la détection et la suppression de la valeur d’élément dupliquée :
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
Fonctions de condition MSBuild
La fonction HasTrailingSlash
n’est pas une fonction d’élément. Il est disponible pour une utilisation avec l’attribut Condition
. Voir les conditions de MSBuild .
Contenu connexe
Vous pouvez également utiliser des attributs pour effectuer des opérations sur des listes d’éléments, telles que le filtrage sur les métadonnées d’élément. Pour plus d’informations, consultez Éléments.