从构建中排除文件

在项目文件中,可以使用通配符将一个目录或一组嵌套目录中的所有文件作为生成输入。 但是,目录中可能有一个文件或一个目录位于一组嵌套的目录中,你不希望将其作为生成输入包含在内。 可以从输入列表中显式排除该文件或目录。 项目中可能还存在一个文件,你只想在特定条件下包含该文件。 可以显式声明将文件包含在构建中的条件。

注释

本文中所述的技术不适用于 F# 和C++。 这些项目系统自行管理源文件。

使用 Visual Studio 排除文件

如果使用 Visual Studio,请在 解决方案资源管理器中选择该文件,查看 “属性” 窗口(按 Alt+Enter),并将 “生成作 ”设置为 “无”。

这会导致 MSBuild 项目文件中发生以下更改:

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

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

这适用于一些文件,但无法扩展到大量文件或符合特定模式的文件。 在 .NET 项目中,可以使用 MSBuild 通过通配符表达式(也称为 glob)排除文件和目录,如下所述。

排除 .NET 项目中的文件或目录

项目列表是构建过程中的输入文件。 对于大多数项目(如 .NET SDK 项目),存在预定义的不同类型项的列表(例如,Compile 代表源文件,Content 代表某些静态文件,等等),这些都是由标准导入已经定义好的。 可以在 Common MSBuild 项目项中找到这些项的列表。 在项目代码中,这些项是预定义的,用于包含所有相关内容;例如, Compile 在 C# 项目中,包括扩展名 .cs 为的所有文件。

若要排除文件,可以使用 Remove 项上的属性。

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

您可以指定多个单独的文件,或使用各种 glob 模式进行搜索。

<ItemGroup>
   <Compile Remove="Contoso*.cs" /> <!-- Wildcard on filename -->
   <Compile Remove="File1.cs;File2.cs" /> <!-- List of files with separator -->
   <Compile Remove="Contoso/**/*.cs" /> <!-- All .cs files in a directory subtree -->
</ItemGroup>

有关支持的模式的列表,请参阅 模式格式

在 MSBuild 语言中包含和排除文件或目录

在原始 MSBuild 语言(即,没有任何标准导入或对 SDK 的引用)中,要包含的项是单独声明的,也可以使用该属性声明为组 Include 。 例如:

<CSFile Include="Form1.cs"/>
<CSFile Include ="File1.cs;File2.cs"/>
<CSFile Include="*.cs"/>
<JPGFile Include="Images\**\*.jpg"/>

如果使用通配符将一个目录中的所有文件或一组嵌套的目录作为生成输入,则目录中可能存在一个或多个文件或不希望包含的嵌套目录集中的一个或多个文件。 若要从项列表中排除项,请使用 Exclude 属性。

Exclude 实际上不是项目操作;它不能单独使用,但只能用作 Include 的修饰符。

包括所有 .cs 文件或 .vb 文件,但不包含 Form2 文件

  • 使用以下属性之一IncludeExclude

    <CSFile Include="*.cs" Exclude="Form2.cs"/>
    

    <VBFile Include="*.vb" Exclude="Form2.vb"/>
    

包括所有.cs文件或.vb文件,除了Form2Form3文件以外。

  • 使用以下属性之一IncludeExclude

    <CSFile Include="*.cs" Exclude="Form2.cs;Form3.cs"/>
    

    <VBFile Include="*.vb" Exclude="Form2.vb;Form3.vb"/>
    

Images目录的子目录中包括所有.jpg文件,但Version2目录中的文件除外

  • 使用IncludeExclude以下属性:

    <JPGFile
        Include="Images\**\*.jpg"
        Exclude = "Images\**\Version2\*.jpg"/>
    

    注释

    必须为这两个属性指定路径。 如果使用绝对路径在属性中 Include 指定文件位置,则还必须在属性中使用绝对路径 Exclude ;如果在属性中使用相对路径 Include ,则还必须在属性中使用 Exclude 相对路径。

排除和删除

如果要定义自己的项列表,应尽可能使用 Exclude 。 在同一声明中使用Exclude时具有性能优势,因为被排除的项不必处理。

在具有预定义的项列表时使用 Remove ,例如,在标准项列表(如 CompileContent)的情况下使用。 在这种情况下,Exclude 是不被支持的。

注释

如果使用支持它的 SDK,则可以将$(OverrideDefaultCompileItems)属性true设置为,并根据需要使用Include和(可选)Exclude定义自己的Compile项。

使用条件从构建输入中排除某个文件或目录

如果想要包括的项目(例如,在调试版本中而不是发布生成中),则可以使用该 Condition 属性来指定要包含该项的条件。

仅在发布版本中包含文件Formula.vb

  • 使用类似于以下内容的Condition属性:

    <Compile
        Include="Formula.vb"
        Condition=" '$(Configuration)' == 'Release' " />
    

示例:

下面的代码示例生成一个项目,其中包含目录中除Form2.cs以外的所有.cs文件。

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

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

    <ItemGroup>
        <CSFile Include="*.cs" Exclude="Form2.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>