빌드할 파일 선택

대부분의 프로젝트에서는 빌드할 파일을 특별히 선택할 필요가 없습니다. 예를 들어 Visual Studio를 사용하여 만든 모든 프로젝트는 프로젝트의 모든 원본 파일을 빌드합니다. 그러나 프로젝트 폴더 외부의 다른 위치에서 파일을 빌드하려는 경우 또는 .NET SDK와 같은 SDK를 사용하는 대신 고유한 빌드 프로세스를 만들 때와 같이 기본값과 다른 시나리오를 처리하도록 프로젝트 파일을 편집하는 방법을 알아야 할 수 있습니다.

프로젝트 형식별 기본 동작

MSBuild가 빌드에 포함하는 파일을 결정하는 기본 동작은 프로젝트 형식에 따라 다릅니다.

.NET SDK 프로젝트의 경우 표준 .NET SDK는 적절한 언어별 파일 확장자와 일치하는 프로젝트 폴더 트리의 파일이 포함된 기본 Compile 항목 목록을 정의합니다. 예를 들어 C# 프로젝트의 경우 Compile 항목은 프로젝트 폴더 및 모든 하위 폴더의 모든 원본 파일과 재귀적으로 일치하는 GLOB 패턴 **/*.cs로 채워집니다. Compile 요소는 암시적으로 가져온 SDK .props 파일에 정의되어 있으므로 프로젝트 파일에 표시되지 않습니다. .NET 프로젝트 SDK 개요 - 기본 포함 및 제외를 참조하세요.

Visual Studio를 사용하는 경우 파일의 빌드 작업을 변경하여 빌드할 원본 파일 집합을 수정할 수 있습니다. 빌드에서 파일을 제외하려면 None으로 설정합니다. Visual Studio에서 이 작업을 수행하면 프로젝트 파일에 영향이 있습니다. Compile 항목 목록에서 원본 파일을 제거하고 None 항목 목록에 추가하기 위해 행이 추가된 것을 확인할 수 있습니다.

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

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

.NET Framework 또는 기타 비 SDK 프로젝트의 경우 Compile 항목은 모든 원본 파일을 나열하여 프로젝트 파일에 명시적으로 구성됩니다.

C++ 프로젝트의 경우 원본 파일은 프로젝트 파일의 ClCompile 요소에 명시적으로 추가됩니다.

SDK를 사용하지 않고 MSBuild 프로젝트 파일을 직접 작성하는 경우 각 원본 파일을 프로젝트 파일에 별도로 나열하거나 와일드카드를 사용하여 모든 파일을 하나의 디렉터리 또는 중첩된 디렉터리 집합에 포함할 수 있습니다. 또한 이 문서의 기술을 사용하여 Compile 항목 목록(.NET 프로젝트의 경우) 또는 C++ 프로젝트의 ClCompile 항목 목록을 수정하여 빌드되는 파일을 사용자 지정할 수도 있습니다.

입력 지정

항목은 빌드의 입력(예: 원본 파일)을 나타냅니다. 항목에 대한 자세한 내용은 항목을 참조하세요.

빌드용 파일을 포함하려면 파일이 항목 목록에 포함되어야 합니다. 앞에서 설명한 대로 .NET SDK 및 .NET Framework 프로젝트에서 원본 파일의 항목 목록은 Compile입니다. 암시적 가져오기에 정의되어 있으므로 .NET SDK 프로젝트에는 Compile 항목 목록이 표시되지 않습니다. 프로젝트 SDK 사용을 참조하세요.

표준 가져오기를 사용하지 않는 프로젝트 파일은 VBFile 또는 CSFile과 같은 임의의 항목 목록 이름을 사용할 수 있습니다. 이 문서의 뒷부분에 나오는 예 1예 2를 참조하세요. 항목 목록을 기반으로 빌드를 설정하려면 이 문서의 뒷부분에서 설명하는 대로 이를 빌드 작업에 이름으로 전달합니다.

파일을 개별적으로 포함하거나 와일드카드를 사용하여 많은 파일을 한 번에 포함하는 방식으로 여러 파일을 항목 목록에 추가할 수 있습니다.

항목을 개별적으로 선언하려면

  • 다음과 비슷한 Include 특성을 사용합니다.

    <Compile Include="Form1.cs"/>

    또는

    <Compile Include="Form1.vb"/>

    참고 항목

    항목 컬렉션의 항목이 프로젝트 파일과 같은 디렉터리에 있지 않으면 항목의 전체 또는 상대 경로를 지정해야 합니다. 예: Include="..\..\Form2.cs"

동일한 항목 목록은 여러 Include 특성에 의해 반복적으로 수정될 수 있습니다. 각 Include는 이전에 있던 항목에 추가됩니다.

여러 항목을 선언하려면

  • 다음과 비슷한 Include 특성을 사용합니다.

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

    또는

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

와일드카드를 사용하여 입력 지정

와일드카드를 사용하여 하위 디렉터리의 모든 파일 또는 특정 파일만 빌드의 입력으로 재귀적으로 포함할 수도 있습니다. 와일드카드에 대한 자세한 내용은 항목을 참조하세요.

다음 예제는 프로젝트 파일이 Project 디렉터리에 있는, 다음 디렉터리와 하위 디렉터리에 그래픽 파일이 포함된 프로젝트를 기반으로 합니다.

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Images 디렉터리 및 하위 디렉터리의 모든 .jpg 파일을 포함하려면

  • 다음 Include 특성을 사용합니다.

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

img로 시작하는 모든 .jpg 파일을 포함하려면

  • 다음 Include 특성을 사용합니다.

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

디렉터리에서 이름이 jpgs로 끝나는 모든 파일을 포함하려면

  • 다음 Include 특성 중 하나를 사용합니다.

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

    또는

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

항목 제외 및 제거

몇 가지 예외를 제외하고 특정 패턴과 일치하는 파일을 지정할 수 있습니다. IncludeExclude를 조합하여 단일 작업으로 수행할 수 있습니다.

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

이전에 포함되었거나 SDK에 의해 기본적으로 포함된 항목을 제거하려면 Remove 특성을 사용하면 됩니다.

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

작업 또는 대상에 항목 전달

대부분의 프로젝트 파일에서는 Compile 항목을 대상이나 작업에 명시적으로 전달할 필요가 없습니다. 이는 표준 가져오기에 의해 처리되기 때문입니다. 그러나 대상 프로젝트 파일의 경우 작업에서 @() 표기법을 사용하여 전체 항목 목록을 빌드에 대한 입력으로 지정할 수 있습니다. 모든 파일을 개별적으로 나열하든지, 와일드카드를 사용하든지 관계없이 이 표기법을 사용할 수 있습니다.

모든 C# 또는 Visual Basic 파일을 컴파일러 작업에 대한 입력으로 사용하려면

  • 다음과 비슷한 Include 특성을 사용합니다.

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

    또는

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

참고 항목

항목과 함께 와일드카드를 사용하여 빌드의 입력을 지정해야 합니다. 입력을 지정하는 데 Csc 또는 Vbc와 같은 MSBuild 작업의 Sources 특성을 사용할 수는 없습니다. 다음 예제는 프로젝트 파일에서 유효하지 않습니다.

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

예 1

다음 코드 예제에서는 모든 입력 파일을 개별적으로 포함하는 프로젝트를 보여 줍니다.

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

예제 2

다음 코드 예제에서는 와일드카드를 사용하여 모든 .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>