Partager via


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 .

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.