Trabajar con funciones de elemento

El código de las tareas y de los destinos puede llamar a funciones de elementos para obtener información sobre los elementos del proyecto (a partir de MSBuild 4.0). Estas funciones simplifican la obtención de elementos distintos y son más rápidas que si se recorren en bucle los elementos.

Funciones de elementos de cadena

Puede usar métodos y propiedades de cadena en .NET Framework para operar en cualquier valor del elemento. Para los métodos String, especifique el nombre del método. Para las propiedades String, especifique el nombre de la propiedad después de "get_".

Para los elementos que tienen varias cadenas, el método o la propiedad de cadena se ejecuta en cada cadena.

En el ejemplo siguiente, se muestra cómo utilizar estas funciones de elementos 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 de elementos intrínsecas

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 que se anexa a todos los elementos de entrada.
Count @(MyItems->Count()) Devuelve el número de elementos.
DirectoryName @(MyItems->DirectoryName()) Devuelve el equivalente de Path.DirectoryName para cada elemento.
Distinct @(MyItems->Distinct()) Devuelve elementos que tienen valores Include distintos. Los metadatos se omiten. En la comparación no se distingue entre mayúsculas y minúsculas.
DistinctWithCase @(MyItems->DistinctWithCase()) Devuelve elementos que tienen valores itemspec distintos. Los metadatos se omiten. En la comparación se distingue entre mayúsculas y minúsculas.
Exists @(MyItems->Exists()) Filtra un conjunto de elementos a los que realmente existen en el disco.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Dado un conjunto de elementos, devuelve aquellos que representan a todos los directorios antecesores. 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 un elemento tiene el nombre y el valor de los metadatos especificados. En la comparación no se distingue entre mayúsculas y minúsculas.
ClearMetadata @(MyItems->ClearMetadata()) Devuelve elementos en los que se han borrado los metadatos. Solo se retiene el itemspec.
HasMetadata @(MyItems->HasMetadata("MetadataName")) Devuelve elementos que tienen el nombre de los metadatos especificado. En la comparación no se distingue entre mayúsculas y minúsculas.
Metadata @(MyItems->Metadata("MetadataName")) Devuelve los valores de los metadatos que tienen el nombre de los metadatos. 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 los metadatos especificados. En la comparación no se distingue entre mayúsculas y 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áticas, por ejemplo, $([System.IO.File]::Exists("path")).

En el ejemplo siguiente, se muestra cómo utilizar las funciones de elementos 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
  -->

Detección de duplicados al usar la función de elemento de metadatos

La función de elementos Metadata 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 administran los elementos duplicados, puede usar el atributo KeepDuplicates. También puede quitar los metadatos, si no son necesarios, agregando 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 como sigue:

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 condiciones de MSBuild

La función HasTrailingSlash no es una función de elemento. Está disponible para su uso con el atributo Condition. Consulte Condiciones de MSBuild.

También puede usar atributos para realizar operaciones en listas de elementos, como filtrar los metadatos de los elementos. Para obtener más información, consulte Elementos.