Partager via


Sélectionnez les fichiers à générer

Dans la plupart des projets, vous n’avez pas besoin de sélectionner spécifiquement les fichiers à générer. Par exemple, tout projet créé avec Visual Studio génère tous les fichiers source dans le projet. Toutefois, vous devrez peut-être savoir comment modifier votre fichier projet pour gérer les scénarios qui diffèrent de la valeur par défaut, par exemple lorsque vous souhaitez générer des fichiers à partir d’autres emplacements en dehors des dossiers de projet, ou lorsque vous créez votre propre processus de génération au lieu d’utiliser un KIT de développement logiciel (SDK) tel que le SDK .NET.

Comportement par défaut par type de projet

Le comportement par défaut qui détermine les fichiers inclus par MSBuild dans la version diffère en fonction du type de projet.

Pour les projets SDK .NET, le SDK .NET standard définit une liste d’éléments Compile par défaut qui contient des fichiers dans l’arborescence des dossiers du projet qui correspondent à l’extension de fichier spécifique à la langue appropriée. Par exemple, pour un projet C#, l’article Compile est rempli avec le modèle glob **/*.cs, qui correspond à tous les fichiers sources dans le dossier du projet et à tous ses sous-dossiers de manière récursive. Vous ne voyez pas l’élément Compile dans le fichier projet, car il est défini dans le fichier SDK .props importé implicitement. Consultez Vue d’ensemble du Kit de développement logiciel (SDK) de projet .NET : inclusions et exclusions par défaut.

Si vous utilisez Visual Studio, vous pouvez modifier l’ensemble de fichiers sources à générer en modifiant l’Action de génération sur un fichier. Définissez-la sur None pour exclure un fichier de la génération. Cette opération dans Visual Studio affecte le fichier projet. Vous verrez que des lignes ont été ajoutées pour supprimer le fichier source de la liste d’éléments Compile et l’ajouter à la liste d’éléments None.

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

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

Pour .NET Framework ou d’autres projets non SDK, l’élément Compile est construit explicitement dans le fichier projet en répertoriant tous les fichiers sources.

Pour les projets C++, les fichiers source sont explicitement ajoutés à l’élément ClCompile du fichier projet.

Quand vous créez manuellement un fichier projet MSBuild dans utiliser de SDK, vous pouvez lister chaque fichier source séparément dans le fichier projet ou utiliser des caractères génériques pour inclure tous les fichiers d’un répertoire ou d’un ensemble imbriqué de répertoires. Vous pouvez également utiliser les techniques de cet article pour modifier la liste d’éléments Compile (dans les projets .NET) ou la liste d’éléments ClCompile dans les projets C++ pour personnaliser les fichiers générés.

Spécifier les entrées

Les éléments représentent les entrées (telles que les fichiers source) d’une génération. Pour plus d’informations sur les éléments, consultez Éléments.

Pour inclure des fichiers pour une génération, vous devez les ajouter à une liste d’éléments. Comme indiqué précédemment, dans les projets .NET SDK et .NET Framework, la liste des éléments pour les fichiers source est Compile. Vous ne voyez pas la liste d’éléments Compile dans les projets SDK .NET, car elle est définie dans les importations implicites. Consultez Utiliser les SDK de projet.

Les fichiers projet qui ne s’appuient pas sur les importations standard peuvent utiliser un nom de liste d’éléments arbitraire, tel que VBFile ou CSFile. Consultez l’Exemple 1 et l’Exemple 2 plus loin dans cet article. Pour configurer une génération basée sur la liste d’éléments, vous faites passez cela par nom à une tâche de génération, comme indiqué plus loin dans cet article.

Plusieurs fichiers peuvent être ajoutés aux listes d’éléments : soit un à un, soit à l’aide de caractères génériques.

Pour déclarer des éléments un à un

  • Utilisez les attributs Include de la façon suivante :

    <Compile Include="Form1.cs"/>

    ou

    <Compile Include="Form1.vb"/>

    Notes

    Si les éléments d’une collection d’éléments ne sont pas dans le même répertoire que le fichier projet, vous devez spécifier le chemin complet ou relatif de l’élément. Par exemple : Include="..\..\Form2.cs".

La même liste d’éléments peut être modifiée à plusieurs reprises par plusieurs attributs Include. Chaque Include ajoute à ce qui était là précédemment.

Pour déclarer plusieurs éléments

  • Utilisez les attributs Include de la façon suivante :

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

    ou

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

Spécifier les entrées avec des caractères génériques

Vous pouvez aussi utiliser des caractères génériques pour inclure tous les fichiers de manière récursive ou n’inclure que certains fichiers des sous-répertoires comme entrées d’une build. Pour plus d’informations sur les caractères génériques, consultez Éléments.

Les exemples suivants s’appuient sur un projet qui contient des fichiers graphiques dans les répertoires et sous-répertoires suivants, avec le fichier projet situé dans le répertoire Project :

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Pour inclure tous les fichiers .jpg dans le répertoire Images et ses sous-répertoires

  • Utilisez l’attribut Include suivant :

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

Pour inclure tous les fichiers .jpg commençant par img

  • Utilisez l’attribut Include suivant :

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

Pour inclure tous les fichiers figurant dans des répertoires dont les noms se terminent par jpgs

  • Utilisez l’un des attributs Include suivants :

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

    ou

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

Exclusion et suppression d’éléments

Vous pouvez spécifier des fichiers qui correspondent à un certain modèle, avec certaines exceptions. Vous pouvez le faire en une seule opération avec une combinaison de Include et Exclude.

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

Pour supprimer un élément précédemment inclus ou inclus par défaut par un KIT de développement logiciel (SDK), vous pouvez utiliser l’attribut Remove.

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

Transmettre des éléments à une tâche ou une cible

Dans la plupart des fichiers projet, vous n’avez pas besoin de transmettre explicitement l’élément Compile à une cible ou une tâche, car cela est géré par les importations standard. Mais dans le cas d’une cible pour le fichier projet, vous pouvez utiliser la notation @() dans les tâches pour spécifier une liste complète d’éléments comme entrée d’une génération. Vous pouvez utiliser cette notation, que vous listiez tous les fichiers un à un ou que vous utilisiez des caractères génériques.

Pour utiliser tous les fichiers C# ou Visual Basic comme entrées vers une tâche de compilateur

  • Utilisez les attributs Include de la façon suivante :

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

    ou

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

Notes

Vous devez utiliser des caractères génériques avec des éléments pour spécifier les entrées d’une build ; vous ne pouvez pas spécifier les entrées à l’aide de l’attribut Sources dans les tâches MSBuild telles que Csc ou Vbc. L’exemple suivant n’est pas valide dans un fichier projet :

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

Exemple 1

L’exemple de code suivant affiche un projet qui inclut séparément tous les fichiers d’entrée.

<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>

Exemple 2

L’exemple de code suivant utilise un caractère générique pour inclure tous les fichiers .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>