从生成中排除文件

在项目文件中,可以使用通配符将一个目录或一组嵌套目录中的所有文件作为生成的输入包括在内。 但是,目录中可能有一个文件或者一组嵌套目录中可能有一个目录,你不希望将其作为生成的输入包括在内。 你可以从输入列表中显示排除该文件或目录。 有些时候,你只希望在特定情况下才包括项目中的某个文件。 那么你可以显式声明将文件包括在生成中的条件。

注意

本文中所述的技术不适用于 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,等等)。 可以在常用的 MSBuild 项目项中找到这些项的列表。 在项目代码中,这些项是预定义的,以包括所有相关内容;例如,C# 项目中的 Compile 包括扩展名为 .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"/>
    

包括所有 .jpg 文件(位于 Images 目录的子目录中),Version2 目录中的相应文件除外

  • 使用以下 IncludeExclude 属性:

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

    注意

    必须指定这两个属性的路径。 如果你使用绝对路径在 Include 属性中指定文件位置,那么在 Exclude 属性中也必须使用绝对路径;如果你在 Include 属性中使用相对路径,那么在 Exclude 属性中也必须使用相对路径。

排除和删除

如果要定义自己的项列表,应尽可能使用 Exclude。 在与 Exclude 相同的声明中使用 Include 会带来性能优势,因为不必处理将被排除的项。

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

注意

如果使用支持它的 SDK,则可以将 $(OverrideDefaultCompileItems) 属性设置为 true,并根据需要使用 IncludeExclude(可选)定义自己的 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>