윈도우 10에는 기본으로
닷넷 프레임워크 4.0 이상, C# 컴파일러, 빌드 프로그램인 MSBuild 라는 프로그램이 있다.
이 MSBuild를 이용하면 우리는 비주얼스튜디오 없이, 메모장만으로 윈도우 프로그램을 만들 수 있다.
하지만 가능하다면 VS Code는 깔려있기를 바란다. 문법 하이라이트가 있고 없고 차이는 생각보다 큰데다,
VS Code에는 터미널이 프로그램 내부에 있어 번거로움도 적다.
그렇다면 MSBuild는 어떻게 이용하면 좋을까?
https://docs.microsoft.com/ko-kr/visualstudio/msbuild/msbuild?view=vs-2022
사실 답을 찾는데는 마이크로소프트 공식문서가 제일 좋다.
MSBuild 는 말 그대로 마이크로소프트에서 만든 빌드 프로그램이다.
이 프로그램을 이용해서 코드를 컴파일하고, 컴파일 에러를 잡고, 프로젝트를 빌드할 수 있다.
이 MSBuild 라는 프로그램은 xml로 된 프로젝트 파일을 이용해서 프로젝트를 빌드한다.
C#으로 WPF 프로그래밍을 하기 때문에 보통 프로젝트 파일의 확장자는 .csproj 를 사용한다.
이 xml 파일은 MSBuild가 어떤순서로, 어떤 소스코드와 리소스를 이용해서 프로젝트를 빌드해야 하는지
하나하나 세세하게 정의하는 문서이다.
MSBuild 는 이 문서의 내용을 읽어서 이 문서의 내용대로 컴파일하고 빌드한다.
xml은 html과 마찬가지로 태그와 속성, 값으로 이루어져있다.
다음은 xml의 기본적인 구조이다.
<태그명 속성="속성값">값</태그명>
(값을 태그로 감싼 구조)
<태그명 속성="속성값"/>
(닫는 태그를 생략한 구조, 태그에 값이 없고, 속성만 존재할 때 사용)
<!-- 주석 처리할 내용 -->
사실 이 스키마 하나도 파고들면 매우 복잡해서 거의 또 다른 언어로 프로그래밍을 하는 것과 같지만,
자주쓰는 것은 아래와 같다.
설정할 프로퍼티, 사용할 아이템(참고할 레퍼런스, 컴파일할 소스코드)
한번 실제 xml 프로젝트 파일을 보자.
다음은 실제 MSBuild 로 빌드할 때 쓰는 프로젝트 파일이다.
<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" DefaultTarget="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionPath)\$(MSBuildToolsVersion)$\Microsoft.Common.props" Condition = "Exists('$(MSBuildExtensionPath)\$(MSBuildToolsVersion)$\Microsoft.Common.props')"/>
<PropertyGroup>
<OutputType>WinExe</OutputType>
</PropertyGroup>
<ItemGroup>
<Reference Include="System"/>
<Reference Include="System.Data"/>
<Reference Include="System.Xml"/>
<Reference Include="System.Core"/>
<Reference Include="System.Xml.Linq"/>
<Reference Include="System.Data.DataSetExtensions"/>
<Reference Include="System.Xaml"/>
<Reference Include="Microsoft.CSharp"/>
<Reference Include="WindowsBase"/>
<Reference Include="PresentationCore"/>
<Reference Include="PresentationFramework"/>
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
</Project>
아까 말했던 3가지가 이 파일에 다 있다.
프로퍼티 = <PropertyGroup> 태그 안에 있는 것
현재 OutputType 이라는 프로퍼티의 값을 WinExe 로 준 상태이다.
이 속성은 말 그대로 빌드한 결과물의 타입을 지정하는 속성이다.
WinExe 는 윈도우 응용프로그램 형태로 빌드하는 것이다.
사용할 아이템 = <ItemGroup> 태그 안에 있는 것
아이템 그룹이 2개가 있다.
첫번째 아이템그룹에는 Reference 태그로 정의한 참고할 라이브러리들이 있다.
이렇게 Reference 태그로 정의를 해야만, 소스코드에서 해당 라이브러리를 사용했을 때 컴파일 오류가 안난다.
두번째 아이템 그룹에는 Compile 태그로 정의한 컴파일할 소스코드들이 있다.
Page 태그, Application 태그도 있지만, 우리가 추가하는 것은 거의 C# 코드이다.
이 코드들은 모두 Compile 태그로 감싸 컴파일하고, 그 결과를 합쳐 빌드한다.
이렇게 어떻게 빌드할지 정의해둔 문서를 MSBuild 에게 넘겨주면
MSBuild 는 이 문서를 해석해서 이 문서에서 정의한대로 빌드하고 결과물을 만든다.
이 문서를 MSBuild 에게 넘겨줄 때는 명령어를 이용한다.
우선 편의를 위해 MSBuild 프로그램을 어디에서도 실행할 수 있도록,
MSBuild 프로그램이 있는 폴더를 환경변수에 추가해주자.
윈도우키를 누르고 '환경 변수' 를 검색하면 나오는 '시스템 환경 변수 편집'을 클릭한다.
우측 하단의 환경 변수를 클릭한다.
상단의 '사용자 변수' 칸에서 Path 변수의 값을 추가해야한다.
Path 를 선택하고 '편집'을 누른다.
새로 만들기를 클릭하고 다음 내용을 입력한다.
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
확인을 눌러 나와준다.
한번 저 경로에 가서 프로그램을 찾아보면 MSBuild.exe 프로그램이 있을 것이다.
이 프로그램을 어떤 위치에서든 명령어로 실행하기 위해 환경변수를 미리 등록해준 것이다.
이 작업을 하지 않으면 매번 저 프로그램의 위치를 같이 입력해서 프로그램을 실행해야한다.
윈도우키 + R 키를 눌러서 실행창을 열고 cmd를 입력하여 cmd를 열어준다.
msbuild 를 입력했을 때 사진과 같이 나오면 정상적인 것이다.
만약 명령어를 찾을 수 없다고 나온다면, 환경변수에 경로 등록이 되지 않은 것이다.
앞으로 프로젝트 파일을 만들면, "msbuild 프로젝트파일명" 으로 명령어를 입력하여
프로젝트 파일에 적힌대로 프로젝트를 빌드할 수 있다.
만약 현재 경로에 프로젝트파일이 있다면, msbuild를 입력하기만해도
알아서 현재 경로(C:\Users\24889)에 있는 프로젝트 파일 내용대로 빌드한다.