Trabajar con funciones de elemento
El código en tareas y destinos puede llamar a funciones de elemento para obtener información sobre los elementos del proyecto (en MSBuild 4.0 y versiones posteriores). Estas funciones simplifican la obtención de elementos distintos y son más rápidas que recorrer en bucle los elementos.
Funciones de elemento de cadena
Puede usar métodos y propiedades de cadena en .NET Framework para operar en cualquier valor de elemento. Para los métodos String, especifique el nombre del método. Para las propiedades de String, especifique el nombre de la propiedad después de "get_".
Para los elementos que tienen varias cadenas, el método de cadena o la propiedad se ejecuta en cada cadena.
En el ejemplo siguiente se muestra cómo usar estas funciones de elemento de cadena.
<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
-->
Funciones intrínsecas de elementos
En la tabla siguiente se enumeran las funciones intrínsecas disponibles para los elementos.
Función | Ejemplo | Descripción |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Devuelve un nuevo conjunto de elementos con una ruta de acceso relativa determinada anexada a todos los elementos de entrada. |
Count |
@(MyItems->Count()) |
Devuelve el conteo de los elementos. |
DirectoryName |
@(MyItems->DirectoryName()) |
Devuelve el equivalente de Path.DirectoryName para cada elemento. |
Distinct |
@(MyItems->Distinct()) |
Devuelve elementos que tienen valores de Include distintos. Los metadatos se omiten. La comparación no distingue mayúsculas de minúsculas. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
Devuelve elementos que tienen valores de itemspec distintos. Los metadatos se omiten. La comparación distingue mayúsculas de minúsculas. |
Exists |
@(MyItems->Exists()) |
Filtra de un conjunto de elementos aquellos que realmente existen en el disco. |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
Dado un conjunto de elementos, devuelve elementos que representan todos los directorios ancestros. No se garantiza ningún pedido. |
Reverse |
@(MyItems->Reverse()) |
Devuelve los elementos en orden inverso. |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
Devuelve un boolean para indicar si algún elemento tiene el nombre y el valor de metadatos especificados. La comparación no distingue mayúsculas de minúsculas. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Devuelve elementos con sus metadatos borrados. Solo se conserva el itemspec . |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
Devuelve elementos que tienen el nombre de metadatos especificado. La comparación no distingue mayúsculas de minúsculas. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
Devuelve los valores de los metadatos que coinciden con el nombre del metadato. Los elementos devueltos tienen los mismos metadatos que los valores de origen. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
Devuelve elementos que tienen el nombre y el valor de metadatos especificados. La comparación no distingue mayúsculas de minúsculas. |
Nota
Exists
también se puede usar en otros contextos; en condiciones de MSBuild, por ejemplo, Condition="Exists('path')"
; o en funciones de propiedad estática, por ejemplo, $([System.IO.File]::Exists("path"))
.
En el ejemplo siguiente se muestra cómo usar funciones de elemento intrínsecas.
<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
-->
Llamar a un método String
Si no hay disponible una función de ítem que coincida con tu escenario, puedes lograr un efecto similar creando un objeto de cadena a partir de los metadatos con la función de propiedad new
y llamando a cualquier método String
sobre él. Por ejemplo, el código siguiente usa una búsqueda de subcadena para filtrar una lista de elementos en un destino.
<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>
Detección de duplicados al usar la función de elemento de metadatos
La función Metadata
elemento conserva los metadatos originales de los elementos de origen. Esto tiene algunas implicaciones al considerar si los elementos devueltos son duplicados o no. Para controlar cómo se controlan los elementos duplicados, puede usar el atributo KeepDuplicates. También puede quitar los metadatos, si no es necesario, agregando el RemoveMetadata, en cuyo caso solo se consideran los propios valores al detectar duplicados.
<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 salida es la siguiente:
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
El siguiente cambio en el código da como resultado que el valor de elemento duplicado se detecte y quite correctamente:
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
Funciones de condición de MSBuild
La función HasTrailingSlash
no es una función de elemento. Está disponible para su uso con el atributo Condition
. Consulte las condiciones de MSBuild .
Contenido relacionado
También puede usar atributos para realizar operaciones en listas de elementos, como el filtrado de metadatos de elementos. Para obtener más información, vea Elementos.