Compartir vía


Seleccionar los archivos que se van a compilar

En la mayoría de los proyectos, no es necesario seleccionar específicamente los archivos que se van a compilar. Por ejemplo, cualquier proyecto creado con Visual Studio compila todos los archivos de origen del proyecto. Sin embargo, es posible que tenga que saber cómo editar el archivo de proyecto para controlar escenarios que difieren del valor predeterminado, como cuando desea compilar archivos desde otras ubicaciones fuera de las carpetas del proyecto o al crear su propio proceso de compilación en lugar de usar un SDK como el SDK de .NET.

Comportamiento predeterminado por tipo de proyecto

El comportamiento predeterminado que determina qué archivos incluye MSBuild en la compilación difiere según el tipo de proyecto.

Para los proyectos del SDK de .NET, el SDK de .NET estándar define una lista de elementos predeterminadaCompile que contiene archivos en el árbol de carpetas del proyecto que coinciden con la extensión adecuada del archivo específico del idioma. Por ejemplo, para un proyecto de C#, el elemento Compile se rellena con el patrón global **/*.cs, que coincide con todos los archivos de origen de la carpeta del proyecto y todas sus subcarpetas de forma recursiva. No ve el elemento Compile en el archivo del proyecto, ya que se define en el archivo del SDK .props que se importa implícitamente. Consulte Información general sobre el SDK de proyectos .NET: inclusiones y exclusiones predeterminadas.

Si usa Visual Studio, puede modificar el conjunto de archivos de origen para compilar cambiando la acción de compilación en un archivo. Establézcalo en None para excluir un archivo de la compilación. Al hacerlo en Visual Studio, esto afecta al archivo del proyecto. Verá que se agregaron líneas para quitar el archivo de origen de la lista de elementos Compile y agregarlo a la lista de elementos None.

  <ItemGroup>
    <Compile Remove="Class.cs" />
  </ItemGroup>

  <ItemGroup>
    <None Include="Class.cs" />
  </ItemGroup>

Para .NET Framework u otros proyectos que no son de SDK, el elemento Compile se construye explícitamente en el archivo de proyecto enumerando todos los archivos de origen.

En el caso de los proyectos de C++, los archivos de origen se agregan explícitamente al elemento ClCompile del archivo del proyecto.

Cuando crea manualmente un archivo de proyecto MSBuild sin utilizar un SDK, se puede enumerar cada archivo de origen en el archivo de proyecto de forma independiente, o bien usar comodines para incluir todos los archivos de un directorio o un conjunto anidado de directorios. También puede usar las técnicas de este artículo para modificar la lista de elementos Compile (en proyectos .NET) o la lista de elementos ClCompile en proyectos C++ para personalizar qué archivos se compilan.

Especificar entradas

Los elementos representan las entradas (como los archivos de origen) para una compilación. Para obtener más información sobre los elementos, vea Elementos.

Para incluir archivos para una compilación, deben estar incluidos en una lista de elementos. Como se explicó anteriormente, en los proyectos .NET SDK y .NET Framework, la lista de elementos de los archivos de origen es Compile. No ve la lista de elementos Compile en los proyectos SDK de .NET, ya que esto se define en las importaciones implícitas. Consulte Uso de SDK de un proyecto.

Los archivos de proyecto que no se basan en las importaciones estándar pueden usar un nombre de lista de elementos arbitrario, como VBFile o CSFile. Vea el Ejemplo 1 y el Ejemplo 2 más adelante en este artículo. Para configurar una compilación basada en la lista de elementos, pase esto por nombre a una tarea de compilación, como se describe más adelante en este artículo.

Es posible agregar varios archivos a las listas de elementos incluyendo cada archivo individualmente o usando comodines para incluir muchos archivos a la vez.

Para declarar elementos individualmente

  • Use atributos Include similares a los siguientes:

    <Compile Include="Form1.cs"/>

    or

    <Compile Include="Form1.vb"/>

    Nota:

    Si los elementos de una colección de elementos no están en el mismo directorio que el archivo de proyecto, debe especificar la ruta de acceso completa o relativa del elemento. Por ejemplo: Include="..\..\Form2.cs".

Varios atributos Include pueden modificar repetidamente la misma lista de elementos. Cada Include se agrega a lo que existía anteriormente.

Para declarar varios elementos

  • Use atributos Include similares a los siguientes:

    <Compile Include="Form1.cs;Form2.cs"/>

    or

    <Compile Include="Form1.vb;Form2.vb"/>

Especifique entradas con comodines

También se pueden usar comodines para incluir recursivamente todos los archivos o solo archivos concretos de subdirectorios como entradas para una compilación. Para obtener más información sobre los caracteres comodín, vea Elementos.

Los ejemplos siguientes están basados en un proyecto que contiene archivos gráficos en los directorios y subdirectorios siguientes, con el archivo de proyecto ubicado en el directorio Project:

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Para incluir todos los archivos .jpg del directorio Images y los subdirectorios

  • Use el atributo Include siguiente:

    Include="Images\**\*.jpg"

Para incluir todos los archivos .jpg que comiencen con img

  • Use el atributo Include siguiente:

    Include="Images\**\img*.jpg"

Para incluir todos los archivos de los directorios con nombres que terminen en jpgs

  • Use uno de los siguientes atributos Include:

    Include="Images\**\*jpgs\*.*"

    o

    Include="Images\**\*jpgs\*"

Exclusión y eliminación de elementos

Es posible que desee especificar archivos que coincidan con un patrón determinado, con algunas excepciones. Puede hacerlo en una sola operación con una combinación de Include y Exclude.

<ItemGroup>
  <!-- Include every C# source file, except anything in the "sub" folder -->
  <Compile Include="**/*.cs" Exclude="sub/**/*.cs">
</ItemGroup>

Para eliminar un elemento que se incluyó anteriormente o se incluyó de forma predeterminada en un SDK, puede usar el atributo Remove.

<ItemGroup>
  <!-- Remove anything in the "sub" folder -->
  <Compile Remove="sub/**/*.cs">
</ItemGroup>

Transferencia de elementos a una tarea o un destino

En la mayoría de los archivos de proyecto, no es necesario transferir explícitamente el elemento Compile a un destino o una tarea, ya que esto se controla mediante las importaciones estándar. Sin embargo, en el caso de un archivo de proyecto, se puede usar la notación @() en las tareas para especificar una lista de elementos completa como entrada de una compilación. Se puede usar esta notación si enumera los archivos de forma separada o si usa comodines.

Para usar todos los archivos de C# o Visual Basic como entradas en una tarea del compilador

  • Use atributos Include similares a los siguientes:

    <CSC Sources="@(CSFile)">...</CSC>

    or

    <VBC Sources="@(VBFile)">...</VBC>

Nota:

Se deben usar comodines con los elementos para especificar las entradas de una compilación; no se pueden especificar las entradas mediante el atributo Sources en tareas de MSBuild como Csc o Vbc. El ejemplo siguiente no es válido en un archivo de proyecto:

<CSC Sources="*.cs">...</CSC>

Ejemplo 1

En el ejemplo de código siguiente se muestra un proyecto que incluye todos los archivos de entrada de forma independiente.

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
    <PropertyGroup>
        <Builtdir>built</Builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="Form1.cs"/>
        <CSFile Include="AssemblyInfo.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>

Ejemplo 2

En el ejemplo de código siguiente se usa un comodín para incluir todos los archivos .cs.

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

    <PropertyGroup>
        <builtdir>built</builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="*.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>