MSBuild로 비주얼 스튜디오 솔루션(.sln)을 빌드할 때

  • Post author:
  • Post category:
  • Post comments:16 Comments
  • Post last modified:July 5, 2008

윈도우 프로젝트 필수 유틸리티엔 다음과 같은 대목이 있다.

< devenv > 를 사용하면 Release 모드와 Debug 모드를 구분해서 빌드할 수 있지만, 32, 64비트 빌드를 구분해서 할 수는 없습니다. < devenv >에서 64비트 빌드를 하려면 프로젝트 설정에서 Win32 플랫폼은 삭제하고 x64만 남겨두어야 합니다. VCBuild는 Release 모드와 Debug 모드를 구분해서 빌드할 수 있고, 32, 64비트 빌드를 구분하여 할 수 있습니다.

여기서 말하는 devenv 엘레멘트는 CruiseControl .NET의 설정 파일인 ccnet.config에서 사용된다. 다행스럽게도 이 문제는 MSBuild를 쓰면 쉽게 해결된다. MSBuild 스크립트에서 윈도우 솔루션 파일을 빌드하고, ccnet.config에선 이 스크립트를 실행시키면 된다. 단, 몇 가지 주의할 점이 있다. 마이크로소프트웨어 연재 칼럼에서 하나씩 밝혀나갈 생각인데, 간단하게 요약해보자.

MSBuild 바이너리를 잘 골라야 한다

MSBuild 바이너리는 닷넷 프레임워크와 함께 배포되며 보통 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exe 같은 경로를 취한다. 이때 해당 소스 코드가 참조하는 닷넷 프레임워크 버전에 맞춰 경로를 잡아야 한다. 또 64비트 컴파일을 할 거라면 Framework가 아닌 Framework64를 선택해야 한다.

C# 프로젝트는 쉽다

C# 같은 순수 닷넷 프로젝트라면 빌드 자동화가 쉽다. 지속적인 통합 5편에서 언급한 바 있듯, C# 프로젝트 파일(.csproj) 및 솔루션 파일(.sln)은 그 자체가 MSBuild 스크립트에 불과하다. 그래서 다음과 같이 ccnet.config를 구성해도 된다.

<tasks>
         <msbuild>
                    <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable>
                    <workingDirectory>C:\src\MyProject -mainbuild\trunk\server\src\ConsoleApplication </workingDirectory>
                   <projectFile>ConsoleApplication .sln</projectFile>
                   <buildArgs>/noconsolelogger /p:Configuration=Debug;Platform=Win32 /v: minimal</buildArgs>
                    <logger>C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll</logger>
         </msbuild>
</tasks>

C++ 프로젝트는 특별하다

안타깝게도 MSBuild 바이너리는 C++ 프로젝트는 빌드하지 못한다. 단 별도의 MSBuild 스크립트를 만들면 방법이 있다. MSBuild엔 <msbuild>란 태스크가 있는데, 여기에 솔루션 파일 이름을 적어주면 대부분 빌드가 된다. 한데 msbuild 태스크는 비주얼 스튜디오 바이너리(devenv.exe)를 호출하지 않고, VCBuild 바이너리를 호출한다. 이는 IDE 종속성을 제거한다는 측면에서 바람직하지만, 안타깝게도 devenv와 VCBuild가 항상 똑같은 방식으로 작동하는 건 아니다. 특히 C++/CLI 기술을 쓰는 경우엔 비주얼 스튜디오로는 빌드가 되던 솔루션을 MSBuild로 빌드하려면 실패하는 일이 잦다.

이땐, MSBuild의 <Exec> 태스크를 사용하여 Devenv를 직접 호출하면 된다. 비주얼 스튜디오 바이너리는 설정(Configuration)값과 플랫폼(Platform)값을 매개변수로 받기 때문에 앞서 윈도우 프로젝트 필수 유틸리티의 한 대목에서 소개한 문제도 발생하지 않는다.

CCNET에는 MSBuild용 로거가 있다. 이 로거는 MSBuild 스크립트에서 <msbuild> 태스크를 사용하여 솔루션 파일을 빌드할 때 가장 잘 작동한다. 하지만 다행스럽게도 <Exec> 태스크를 사용해도 이 로거는 작동한다. 단지, 로그 상세 정도를 지정하는 옵션(Verbose)은 제대로 동작하지 않기 때문에, 웹 대시보드에서 표시되는 로그가 상당히 길어지기 마련이다. 하지만 빌드가 깨졌을 때만 웹 대시보드에 들리게 되니 마우스 스크롤의 불편함 정도는 감수할만하다.

Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
follow me
  • 싸이월드 법인가 뭔가 화제였는데 이런 게 훨씬 현실적인 접근이다 https://t.co/fSB9LiMYzO
    1 day ago
  • 시장을 좋게 보는 사람을 좋게 볼 근거를 찾고 그렇지 않은 사람은 나쁘게 볼 근거만 열심히 찾네. 그 반대로 해야 얻는 게 있을텐데
    1 day ago
  • 일본이 liberal country 라는 말이 마음에 걸리네 https://t.co/aLteP9gEE8
    2 days ago
Buy me a coffeeBuy me a coffee
×
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
Latest Posts