빌드에서 파일 제외

프로젝트 파일에서 와일드카드를 사용하여 모든 파일을 하나의 디렉터리 또는 중첩된 디렉터리 집합에 빌드의 입력으로 포함할 수 있습니다. 그러나 해당 디렉터리 또는 중첩된 디렉터리 집합 중 하나의 디렉터리에 빌드의 입력으로 포함하지 않으려는 하나의 파일이 있을 수 있습니다. 입력 목록에서 해당 파일 또는 디렉터리를 명시적으로 제외할 수 있습니다. 특정 조건에서만 포함하려는 파일이 프로젝트에 있을 수도 있습니다. 파일을 빌드에 포함할 조건을 명시적으로 선언할 수 있습니다.

참고 항목

이 문서에 설명된 기술은 F# 및 C++에 적용되지 않습니다. 이러한 프로젝트 시스템은 원본 파일 자체를 관리합니다.

Visual Studio를 사용하여 파일 제외

Visual Studio를 사용하는 경우 솔루션 탐색기의 파일을 선택하고 속성 창을 확인(Alt+Enter 키를 누르기)한 다음 빌드 작업None으로 설정합니다.

그러면 MSBuild 프로젝트 파일이 다음과 같이 변경됩니다.

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

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

이는 소수의 파일에서 잘 작동하지만 더 많은 수의 파일 또는 특정 패턴과 일치하는 파일로 확장되지는 않습니다. .NET 프로젝트에서 MSBuild를 사용하여 다음 설명과 같이 glob라고도 하는 와일드카드 식을 사용하여 파일과 디렉터리를 제외할 수 있습니다.

.NET 프로젝트에서 파일 또는 디렉터리 제외

항목 목록은 빌드에 사용할 입력 파일입니다. .NET SDK 프로젝트와 같은 대부분의 프로젝트에는 표준 가져오기에서 이미 정의한 다양한 유형의 항목(예: 원본 파일 Compile, 특정 정적 파일 Content 등)에 대해 미리 정의된 항목 목록이 있습니다. 이러한 항목의 목록은 Common 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"/>
    

Form3 및 을(를) 제외한 Form2 모든 .cs 파일 또는 .vb 파일을 포함하려면

  • 다음 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를 사용해야 합니다. 제외되는 항목은 처리할 필요가 없으므로 Include와 동일한 선언에서 Exclude를 사용할 경우 성능상 이점이 있습니다.

Compile, Content 등 표준 항목 목록의 경우와 같이 미리 정의된 항목 목록이 있는 경우 Remove를 사용합니다. 이 경우 Exclude는 지원되지 않습니다.

참고 항목

지원하는 SDK를 사용하는 경우 $(OverrideDefaultCompileItems) 속성을 true로 설정하여 필요에 따라 고유한 Compile 항목을 Include 또는 Exclude로 정의할 수 있습니다.

조건을 사용하여 빌드의 입력에서 파일 또는 디렉터리 제외

예를 들어 디버그 빌드에 포함하지만 릴리스 빌드에는 포함하지 않으려는 항목이 있는 경우 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>