Compartir a través de


Definiciones de elementos

MSBuild 2.0 habilita la declaración estática de elementos en archivos de proyecto mediante el elemento ItemGroup . Sin embargo, los metadatos solo se pueden agregar en el nivel de elemento, incluso si los metadatos son idénticos para todos los elementos. A partir de MSBuild 3.5, un elemento de proyecto denominado ItemDefinitionGroup supera esta limitación. ItemDefinitionGroup permite definir un conjunto de definiciones de elementos, que agregan valores de metadatos predeterminados a todos los elementos del tipo de elemento con nombre.

El elemento ItemDefinitionGroup aparece inmediatamente después del elemento Project del archivo del proyecto. Las definiciones de elementos proporcionan la siguiente funcionalidad:

  • Puede definir metadatos predeterminados globales para los elementos fuera de un destino. Es decir, los mismos metadatos se aplican a todos los elementos del tipo especificado.

  • Los tipos de elemento pueden tener varias definiciones. Cuando se agregan especificaciones de metadatos adicionales al tipo, la última especificación tiene prioridad. (Los metadatos siguen el mismo orden de importación que las propiedades siguientes).

  • Los metadatos pueden ser aditivos. Por ejemplo, los valores de CDefines se acumulan condicionalmente, en función de las propiedades que se establecen. Por ejemplo: MT;STD_CALL;DEBUG;UNICODE.

  • Los metadatos se pueden quitar.

  • Las condiciones se pueden usar para controlar la inclusión de metadatos.

Valores predeterminados de metadatos de elemento

Los metadatos de elemento definidos en un ItemDefinitionGroup son solo una declaración de metadatos predeterminados. Los metadatos no se aplican a menos que defina un elemento que use itemGroup para contener los valores de metadatos.

Nota:

En muchos de los ejemplos de este tema, se muestra un elemento ItemDefinitionGroup, pero se omite su definición ItemGroup correspondiente para mayor claridad.

Los metadatos definidos explícitamente en un ItemGroup tienen prioridad sobre los metadatos de ItemDefinitionGroup. Los metadatos de ItemDefinitionGroup solo se aplican para metadatos no definidos en un ItemGroup. Por ejemplo:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <n>n1</n>
    </i>
</ItemDefinitionGroup>
<ItemGroup>
    <i Include="a">
        <o>o1</o>
        <n>n2</n>
    </i>
</ItemGroup>

En este ejemplo, los metadatos predeterminados "m" se aplican al elemento "i" porque los metadatos "m" no se definen explícitamente mediante el elemento "i". Sin embargo, los metadatos predeterminados "n" no se aplican al elemento "i" porque los metadatos "n" ya están definidos por el elemento "i".

Nota:

Los nombres de elementos y parámetros XML distinguen mayúsculas de minúsculas. Los metadatos de elemento y los nombres de elemento/propiedad no distinguen mayúsculas de minúsculas. Por lo tanto, los elementos ItemDefinitionGroup que tienen nombres que solo difieren por caso deben tratarse como el mismo ItemGroup.

Orígenes de valores

Los valores de los metadatos definidos en un ItemDefinitionGroup pueden proceder de muchos orígenes diferentes, como se indica a continuación:

  • PropertyGroup (propiedad)

  • Elemento de un ItemDefinitionGroup

  • Transformación de elemento en un elemento ItemDefinitionGroup

  • Variable del entorno

  • Propiedad global (desde la línea de comandos deMSBuild.exe )

  • Propiedad reservada

  • Metadatos conocidos en un elemento de un ItemDefinitionGroup

  • Sección <CDATA ![ CDATA[nada aquí no se analiza]]>

Nota:

Los metadatos de elemento de un itemGroup no son útiles en una declaración de metadatos itemDefinitionGroup porque los elementos ItemDefinitionGroup se procesan antes que los elementos ItemGroup.

Aditiva y varias definiciones

Al agregar definiciones o usar varios ItemDefinitionGroups, recuerde lo siguiente:

  • Se agrega una especificación de metadatos adicional al tipo .

  • La última especificación tiene prioridad.

Cuando tiene varios ItemDefinitionGroups, cada especificación posterior agrega sus metadatos a la definición anterior. Por ejemplo:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <n>n1</n>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <o>o1</o>
    </i>
</ItemDefinitionGroup>

En este ejemplo, los metadatos "o" se agregan a "m" y "n".

Además, también se pueden agregar valores de metadatos definidos previamente. Por ejemplo:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <m>%(m);m2</m>
    </i>
</ItemDefinitionGroup>

En este ejemplo, el valor definido anteriormente para los metadatos "m" (m1) se agrega al nuevo valor (m2), de modo que el valor final sea "m1; m2".

Nota:

Esto también puede ocurrir en el mismo ItemDefinitionGroup.

Al invalidar los metadatos definidos anteriormente, la última especificación tiene prioridad. En el ejemplo siguiente, el valor final de los metadatos "m" va de "m1" a "m1a".

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <m>m1a</m>
    </i>
</ItemDefinitionGroup>

Condiciones de uso en itemDefinitionGroup

Puede usar condiciones en itemDefinitionGroup para controlar la inclusión de metadatos. Por ejemplo:

<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>

En este caso, los metadatos predeterminados "m1" del elemento "i" solo se incluyen si el valor de la propiedad "Configuration" es "Debug".

Nota:

Solo se admiten referencias de metadatos locales en condiciones.

Las referencias a los metadatos definidos en un itemDefinitionGroup anterior son locales para el elemento, no para el grupo de definiciones. Es decir, el ámbito de las referencias es específico del elemento. Por ejemplo:

<ItemDefinitionGroup>
    <test>
        <yes>1</yes>
    </test>
    <i>
        <m>m0</m>
        <m Condition="'%(test.yes)'=='1'">m1</m>
    </i>
</ItemDefinitionGroup>

En el ejemplo anterior, el elemento "i" hace referencia al elemento "test" en su condición. Esta condición nunca será verdadera porque MSBuild interpreta una referencia a los metadatos de otro elemento en itemDefinitionGroup como la cadena vacía. Por lo tanto, "m" se establecería en "m0".

  <ItemDefinitionGroup>
    <i>
      <m>m0</m>
      <yes>1</yes>
      <m Condition="'%(i.yes)'=='1'">m1</m>
    </i>
  </ItemDefinitionGroup>

En el ejemplo anterior, "m" se establecería en el valor "m1" como condición hace referencia al elemento "i"s metadata value for item "yes".

Invalidación y eliminación de metadatos

Los metadatos definidos en un elemento ItemDefinitionGroup se pueden invalidar en un elemento ItemDefinitionGroup posterior estableciendo el valor de metadatos en otro valor. También puede eliminar eficazmente un elemento de metadatos si lo establece en un valor vacío. Por ejemplo:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
    </i>
</ItemDefinitionGroup>
<ItemDefinitionGroup>
    <i>
        <m></m>
    </i>
</ItemDefinitionGroup>

El elemento "i" todavía contiene los metadatos "m", pero su valor ahora está vacío.

Ámbito de metadatos

ItemDefinitionGroups tiene ámbito global en propiedades globales y definidas dondequiera que se definan. Las definiciones de metadatos predeterminadas en un ItemDefinitionGroup pueden ser referenciales por sí solos. Por ejemplo, a continuación se usa una referencia de metadatos simple:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <m>%(m);m2</m>
    </i>
</ItemDefinitionGroup>

También se puede usar una referencia de metadatos calificados:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <m>%(i.m);m2</m>
    </i>
</ItemDefinitionGroup>

Sin embargo, lo siguiente no es válido:

<ItemDefinitionGroup>
    <i>
        <m>m1</m>
        <m>@(x)</m>
    </i>
</ItemDefinitionGroup>

A partir de MSBuild 3.5, ItemGroups también puede ser referencial. Por ejemplo:

<ItemGroup>
    <item Include="a">
        <m>m1</m>
        <m>%(m);m2</m>
    </item>
</ItemGroup>