연습: 처음부터 새로 MSBuild 프로젝트 파일 만들기
Visual C#, Visual Basic 등 .NET Framework를 대상으로 하는 프로그래밍 언어는 MSBuild 프로젝트 파일을 사용하여 응용 프로그램 빌드 프로세스를 설명하고 제어합니다. Visual Studio를 사용하여 MSBuild 프로젝트 파일을 만들면 적합한 XML이 파일에 자동으로 추가됩니다. 그러나 XML이 구성되어 있는 방식과 XML을 변경하여 빌드를 제어하는 방법을 이해하면 유용할 수 있습니다. 이 연습에서는 텍스트 편집기를 사용해서만 기본 프로젝트 파일을 증분 방식으로 만드는 방법을 보여 줍니다. 이 연습에서는 다음 단계를 수행합니다.
간단한 응용 프로그램 소스 파일을 만듭니다.
간단한 MSBuild 프로젝트 파일을 만듭니다.
MSBuild를 포함하도록 PATH 환경 변수를 확장합니다.
프로젝트 파일을 사용하여 응용 프로그램을 빌드합니다.
빌드를 제어할 속성을 추가합니다.
속성 값을 변경하여 빌드를 제어합니다.
빌드에 대상을 추가합니다.
대상을 지정하여 빌드를 제어합니다.
증분 방식으로 빌드합니다.
이 연습에서는 명령줄 프롬프트에서 프로젝트를 빌드하고 결과를 보는 방법을 보여 줍니다. MSBuild 및 MSBuild를 실행하는 방법에 대한 자세한 내용은 연습: MSBuild 사용을 참조하십시오.
이 연습을 완료하려면 연습에 필요한 MSBuild 및 Visual C# 컴파일러가 포함되어 있는 .NET Framework(버전 2.0, 3.5 또는 4)가 설치되어 있어야 합니다.
간단한 응용 프로그램 만들기
이 단원에서는 텍스트 편집기를 사용하여 간단한 Visual C# 응용 프로그램 소스 파일을 만드는 방법을 보여 줍니다.
간단한 응용 프로그램을 만들려면
명령 프롬프트에서 \My Documents\, \Desktop\ 등 응용 프로그램을 만들 폴더로 이동합니다.
md HelloWorld를 입력하여 이름이 \HelloWorld\인 하위 폴더를 만듭니다.
cd HelloWorld를 입력하여 새 폴더로 변경합니다.
메모장 또는 다른 텍스트 편집기를 시작한 후 다음 코드를 입력합니다.
using System; class HelloWorld { static void Main() { #if DebugConfig Console.WriteLine("WE ARE IN THE DEBUG CONFIGURATION"); #endif Console.WriteLine("Hello, world!"); } }
이 소스 코드 파일을 저장하고 이름을 Helloworld.cs로 지정합니다.
명령 프롬프트에 csc helloworld.cs를 입력하여 응용 프로그램을 빌드합니다.
명령 프롬프트에 helloworld를 입력하여 응용 프로그램을 테스트합니다.
Hello, world! 메시지가 표시됩니다.
명령 프롬프트에 del helloworld.exe를 입력하여 응용 프로그램을 삭제합니다.
간단한 MSBuild 프로젝트 파일 만들기
지금 간단한 응용 프로그램 소스 파일이 있으므로 응용 프로그램을 빌드할 간단한 프로젝트 파일을 만들 수 있습니다. 이 프로젝트 파일에는 다음 요소가 포함됩니다.
필수 루트 Project 노드
항목 요소를 포함하는 ItemGroup 노드
응용 프로그램 소스 파일을 참조하는 항목 요소
응용 프로그램을 빌드하는 데 필요한 작업을 포함하는 Target 노드
Visual C# 컴파일러를 시작하여 응용 프로그램을 빌드하는 Task 요소
간단한 MSBuild 프로젝트 파일을 만들려면
텍스트 편집기에서 다음 두 줄을 사용하여 기존 텍스트를 바꿉니다.
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003"> </Project>
이 ItemGroup 노드를 Project 노드의 자식 요소로 삽입합니다.
<ItemGroup> <Compile Include="helloworld.cs" /> </ItemGroup>
이 ItemGroup에는 이미 항목 요소가 있습니다.
Target 노드를 Project 노드의 자식 요소로 추가합니다. 노드 이름을 Build로 지정합니다.
<Target Name="Build"> </Target>
이 작업 요소를 Target 노드의 자식 요소로 삽입합니다.
<Csc Sources="@(Compile)"/>
이 프로젝트 파일을 저장하고 이름을 Helloworld.csproj로 지정합니다.
간단한 프로젝트 파일은 다음 코드와 같아야 합니다.
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Include="helloworld.cs" />
</ItemGroup>
<Target Name="Build">
<Csc Sources="@(Compile)"/>
</Target>
</Project>
Build 대상의 작업은 순차적으로 실행됩니다. 이 경우에는 Visual C# 컴파일러 Csc 작업이 유일한 작업입니다. 이 작업은 컴파일할 소스 파일 목록을 예상하고 목록은 Compile 항목 값에 의해 제공됩니다. Compile 항목은 Helloworld.cs 소스 파일 하나만 참조합니다.
참고
항목 요소에서 다음과 같이 별표 와일드카드 문자(*)를 사용하여 파일 확장명이 .cs인 모든 파일을 참조할 수 있습니다.
<Compile Include="*.cs" />
그러나 와일드카드 문자는 소스 파일이 추가되거나 삭제될 때 디버깅 및 선택적 대상 지정을 보다 어렵게 만들기 때문에 사용하지 않는 것이 좋습니다.
MSBuild를 포함하도록 경로 확장
MSBuild에 액세스하려면 .NET Framework 폴더를 포함하도록 PATH 환경 변수를 확장해야 합니다.
MSBuild를 포함하도록 경로를 확장하려면
명령 프롬프트에 set PATH=%PATH%;%WINDIR%\Microsoft.Net\Framework\v4.0을 입력합니다. 다른 버전의 .NET Framework가 설치되어 있는 경우 버전 번호를 이에 알맞게 변경합니다.
참고
컴퓨터에 대한 MSBuild 폴더 이름에는 v2.0.50727과 같은 빌드 번호가 포함될 수 있습니다. 그런 경우 set PATH=%PATH%;%WINDIR%\Microsoft.Net\Framework\v2.0.50727과 같이 명령줄에 빌드 번호를 포함합니다.
또는 Visual Studio가 설치되어 있는 경우 MSBuild 폴더를 포함하는 경로가 있는 Visual Studio 명령 프롬프트를 사용할 수 있습니다.
프로젝트 파일을 사용하여 응용 프로그램 빌드
이제 응용 프로그램을 빌드하기 위해 방금 만든 프로젝트 파일을 사용합니다.
응용 프로그램을 빌드하려면
명령 프롬프트에 msbuild helloworld.csproj /t:Build을 입력합니다.
이 코드는 Helloworld 응용 프로그램을 만드는 Visual C# 컴파일러를 호출하여 Helloworld 프로젝트 파일의 빌드 대상을 빌드합니다.
helloworld를 입력하여 응용 프로그램을 테스트합니다.
Hello, world! 메시지가 표시됩니다.
참고
자세한 정도를 늘려 빌드에 대한 추가 정보를 볼 수 있습니다. 자세한 정도를 "자세히"로 설정하려면 명령 프롬프트에 다음 명령을 입력합니다.
msbuild helloworld.csproj /t:Build /verbosity:detailed
빌드 속성 추가
빌드 제어 성능을 늘리기 위해 프로젝트 파일에 빌드 속성을 추가할 수 있습니다. 이제 다음과 같은 속성을 추가합니다.
응용 프로그램 이름을 지정하는 AssemblyName 속성
응용 프로그램을 포함하는 폴더를 지정하는 OutputPath 속성
빌드 속성을 추가하려면
명령 프롬프트에 del helloworld.exe를 입력하여 기존 응용 프로그램을 삭제합니다.
프로젝트 파일에서 열리는 Project 요소 바로 앞에 이 PropertyGroup 요소를 삽입합니다.
<PropertyGroup> <AssemblyName>MSBuildSample</AssemblyName> <OutputPath>Bin\</OutputPath> </PropertyGroup>
Csc 작업 바로 앞에 있는 빌드 대상에 이 작업을 추가합니다.
<MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
MakeDir 작업이 OutputPath 속성에 의해 이름이 지정되는 폴더를 만듭니다(해당 이름의 폴더가 현재 없는 경우).
이 OutputAssembly 특성을 Csc 작업에 추가합니다.
<Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
이렇게 하면 Visual C# 컴파일러가 AssemblyName 속성에 의해 이름이 지정되는 어셈블리를 생성하고 해당 어셈블리를 OutputPath 속성에 의해 이름이 지정되는 폴더에 배치합니다.
변경 사항을 저장합니다.
이제 프로젝트 파일은 다음 코드와 같아야 합니다.
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AssemblyName>MSBuildSample</AssemblyName>
<OutputPath>Bin\</OutputPath>
</PropertyGroup>
<ItemGroup>
<Compile Include="helloworld.cs" />
</ItemGroup>
<Target Name="Build">
<MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
<Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
</Target>
</Project>
참고
백슬래시(\) 경로 구분 기호를 Csc 작업의 OutputAssembly 특성에 추가하는 대신 OutputPath 요소에 지정하는 경우 폴더 이름 끝에 추가하는 것이 좋습니다. 따라서
<OutputPath>Bin\</OutputPath>
OutputAssembly=="$(OutputPath)$(AssemblyName).exe" />
위 코드가 다음 코드보다 좋습니다.
<OutputPath>Bin</OutputPath>
OutputAssembly=="$(OutputPath)\$(AssemblyName).exe" />
빌드 속성 테스트
이제 출력 폴더 및 응용 프로그램 이름을 지정하기 위해 빌드 속성을 사용한 프로젝트 파일을 사용하여 응용 프로그램을 빌드할 수 있습니다.
빌드 속성을 테스트하려면
명령 프롬프트에 msbuild helloworld.csproj /t:Build을 입력합니다.
이 코드는 \Bin\ 폴더를 만든 다음 Visual C# 컴파일러를 호출하여 MSBuildSample 응용 프로그램을 만들고 \Bin\ 폴더에 배치합니다.
\Bin\ 폴더가 생성되고 해당 폴더에 MSBuildSample 응용 프로그램이 들어 있는지 확인하려면 dir Bin을 입력합니다.
Bin\MSBuildSample을 입력하여 응용 프로그램을 테스트합니다.
Hello, world! 메시지가 표시됩니다.
빌드 대상 추가
이제 다음과 같이 프로젝트 파일에 두 개 이상의 대상을 추가합니다.
이전 파일을 삭제하는 Clean 대상입니다.
DependsOnTargets 특성을 사용하여 Clean 작업이 Build 작업 이전에 실행되도록 강제로 지정하는 Rebuild 대상입니다.
이제 여러 대상이 있으므로 Build 대상을 기본 대상으로 설정할 수 있습니다.
빌드 대상을 추가하려면
프로젝트 파일에서 이 두 대상을 Build 대상 바로 앞에 추가합니다.
<Target Name="Clean" > <Delete Files="$(OutputPath)$(AssemblyName).exe" /> </Target> <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
Clean 대상은 Delete 작업을 호출하여 응용 프로그램을 삭제합니다. Clean 대상과 Build 대상이 모두 실행되어야 Rebuild 대상이 실행됩니다. Rebuild 대상은 작업을 포함하지 않지만 이 대상으로 인해 Clean 대상이 Build 대상 이전에 실행됩니다.
이 DefaultTargets 특성을 여는 Project 요소에 추가합니다.
<Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
이 특성은 Build 대상을 기본 대상으로 설정합니다.
이제 프로젝트 파일은 다음 코드와 같아야 합니다.
<Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<AssemblyName>MSBuildSample</AssemblyName>
<OutputPath>Bin\</OutputPath>
</PropertyGroup>
<ItemGroup>
<Compile Include="helloworld.cs" />
</ItemGroup>
<Target Name="Build">
<MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
<Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
</Target>
<Target Name="Clean" >
<Delete Files="$(OutputPath)$(AssemblyName).exe" />
</Target>
<Target Name="Rebuild" DependsOnTargets="Clean;Build" />
</Project>
빌드 대상 테스트
새 빌드 대상을 실행하여 프로젝트 파일의 다음과 같은 기능을 테스트할 수 있습니다.
기본 빌드 작성
명령 프롬프트에서 응용 프로그램 이름 설정
다른 응용 프로그램을 빌드하기 전에 응용 프로그램 삭제
다른 응용 프로그램을 빌드하지 않고 응용 프로그램 삭제
빌드 대상을 테스트하려면
명령 프롬프트에 msbuild helloworld.csproj /p:AssemblyName=Greetings을 입력합니다.
/t 스위치를 사용하여 대상을 명시적으로 설정하지 않았으므로 MSBuild에서 기본 Build 대상을 실행합니다. /p 스위치가 AssemblyName 속성을 재정의하고 이 속성에 새 값 Greetings를 지정합니다. 이렇게 하면 새 응용 프로그램 Greetings.exe가 \Bin\ 폴더에 생성됩니다.
\Bin\ 폴더에 MSBuildSample 응용 프로그램과 새 Greetings 응용 프로그램이 모두 들어 있는지 확인하려면 dir Bin을 입력합니다.
Bin\Greetings를 입력하여 Greetings 응용 프로그램을 테스트합니다.
Hello, world! 메시지가 표시됩니다.
msbuild helloworld.csproj /t:clean을 입력하여 MSBuildSample 응용 프로그램을 삭제합니다.
이렇게 하면 Clean 작업이 실행되어 기본 AssemblyName 속성 값 MSBuildSample이 있는 응용 프로그램이 제거됩니다.
msbuild helloworld.csproj /t:clean /p:AssemblyName=Greetings를 입력하여 Greetings 응용 프로그램을 삭제합니다.
이렇게 하면 Clean 작업이 실행되어 제공된 AssemblyName 속성 값 Greetings가 있는 응용 프로그램이 제거됩니다.
이제 \Bin\ 폴더가 비어 있는지 확인하려면 dir Bin을 입력합니다.
msbuild를 입력합니다.
프로젝트 파일을 지정하지 않아도 MSBuild는 현재 폴더에 프로젝트 파일이 하나만 있으므로 helloworld.csproj 파일을 빌드합니다. 이렇게 하면 \Bin\ 폴더에 MSBuildSample 응용 프로그램이 생성됩니다.
\Bin\ 폴더에 MSBuildSample 응용 프로그램이 들어 있는지 확인하려면 dir Bin을 입력합니다.
증분 방식으로 빌드
대상이 의존하는 소스 파일 또는 대상 파일이 변경된 경우에만 대상을 빌드하도록 MSBuild에게 지시할 수 있습니다. MSBuild는 파일의 타임스탬프를 사용하여 파일이 변경되었는지 여부를 확인합니다.
증분 방식으로 빌드하려면
프로젝트 파일에서 이러한 특성을 열려 있는 Build 대상에 추가합니다.
Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe"
이는 Build 대상이 Compile 항목 그룹에 지정된 입력 파일에 의존하고 출력 대상이 응용 프로그램 파일임을 지정합니다.
결과 Build 대상은 다음 코드와 같아야 합니다.
<Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe"> <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" /> <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" /> </Target>
명령 프롬프트에 msbuild /v:d를 입력하여 Build 대상을 테스트합니다.
helloworld.csproj가 기본 프로젝트 파일이고 Build가 기본 대상임을 기억하십시오.
/v:d 스위치는 빌드 프로세스의 자세한 설명을 지정합니다.
다음과 같은 줄이 표시됩니다.
Skipping target "Build" because all output files are up-to-date with respect to the input files.
Input files: HelloWorld.cs
Output files: Bin\MSBuildSample.exe
응용 프로그램이 마지막으로 빌드된 이후 소스 파일 중 변경된 파일이 없으므로 MSBuild가 Build 대상을 건너뜁니다.
예제
설명
다음 예제에서는 Visual C# 응용 프로그램을 컴파일하고 출력 파일 이름이 들어 있는 메시지를 기록하는 프로젝트 파일을 보여 줍니다.
코드
<Project DefaultTargets = "Compile"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >
<!-- Set the application name as a property -->
<PropertyGroup>
<appname>HelloWorldCS</appname>
</PropertyGroup>
<!-- Specify the inputs by type and file name -->
<ItemGroup>
<CSFile Include = "consolehwcs1.cs"/>
</ItemGroup>
<Target Name = "Compile">
<!-- Run the Visual C# compilation using input files of type CSFile -->
<CSC
Sources = "@(CSFile)"
OutputAssembly = "$(appname).exe">
<!-- Set the OutputAssembly attribute of the CSC task
to the name of the executable file that is created -->
<Output
TaskParameter = "OutputAssembly"
ItemName = "EXEFile" />
</CSC>
<!-- Log the file name of the output file -->
<Message Text="The output file is @(EXEFile)"/>
</Target>
</Project>
예제
설명
다음 예제에서는 Visual Basic 응용 프로그램을 컴파일하고 출력 파일 이름이 들어 있는 메시지를 기록하는 프로젝트 파일을 보여 줍니다.
코드
<Project DefaultTargets = "Compile"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >
<!-- Set the application name as a property -->
<PropertyGroup>
<appname>HelloWorldVB</appname>
</PropertyGroup>
<!-- Specify the inputs by type and file name -->
<ItemGroup>
<VBFile Include = "consolehwvb1.vb"/>
</ItemGroup>
<Target Name = "Compile">
<!-- Run the Visual Basic compilation using input files of type VBFile -->
<VBC
Sources = "@(VBFile)"
OutputAssembly= "$(appname).exe">
<!-- Set the OutputAssembly attribute of the VBC task
to the name of the executable file that is created -->
<Output
TaskParameter = "OutputAssembly"
ItemName = "EXEFile" />
</VBC>
<!-- Log the file name of the output file -->
<Message Text="The output file is @(EXEFile)"/>
</Target>
</Project>
추가 사항
Visual Studio에서는 이 연습에서 보여 준 많은 작업을 자동으로 수행할 수 있습니다. Visual Studio를 사용하여 MSBuild 프로젝트 파일을 만들고, 편집하고, 빌드하고, 테스트하는 방법을 배우려면 연습: MSBuild 사용을 참조하십시오.