NAnt 또는 MSBuild 중 어느 것을 언제 선택해야합니까?


160

Stack Overflow에 다른 NAntMSBuild 관련 질문 이 있다는 것을 알고 있지만 둘 사이의 직접적인 비교를 찾을 수 없으므로 여기에 질문이 있습니다.

언제 MSBuild보다 NAnt를 선택해야합니까? 어느 쪽이 더 좋을까요? NAnt는 가정 / 오픈 소스 프로젝트와 MSBuild for work 프로젝트에 더 적합합니까? 둘 중 어느 것에 대한 경험이 있습니까?

답변:


97

이번 주에도 비슷한 조사를 수행했습니다. 내가 결정할 수 있었던 것은 다음과 같습니다.

없음 :

  • 크로스 플랫폼 (Linux / Mono 지원). 예를 들어 웹 사이트를 여러 대상 (예 : Linux Apache 및 Windows IIS)에 설치하는 것이 편리 할 수 ​​있습니다.
  • Ant와 구문이 95 % 비슷 함 (현재 Ant 사용자 또는 Java 빌더가 쉽게 선택할 수 있음)
  • 빌드의 일부로 유닛 테스트를 실행하기 위해 NUnit과 통합하고 제품 문서화를 위해 NDoc과 통합합니다.

MSBuild :

  • .NET에 내장
  • Visual Studio와 통합
  • Visual Studio에서 MSBuild를 쉽게 시작할 수 있습니다. 더 깊이 들어가고 싶다면 파일을 직접 편집 할 수 있습니다.

주관적인 차이 : (YMMV)

  • NAnt 문서는 조금 더 간단합니다. 예를 들어, MSBuild 작업 참조 는 "Csc 작업-Csc 작업 및 해당 매개 변수를 설명합니다."( "도움말"에 대한 감사?)와 NAnt 작업 참조 "csc-C # 프로그램 컴파일"을 나열합니다. 업데이트 : 내가 눈치 챘을 MSBuild를 문서 향상되었습니다 및 (아마도은 NAnt와 파에) 훨씬 낫다.
  • Visual Studio 내에서 직접 빌드 스크립트 소스 (*. * proj 파일)를 편집하는 방법을 알아내는 것은 쉽지 않습니다. NAnt에서는 Visual Studio에서 .build 스크립트를 XML 파일로 취급합니다.
  • 분명히 Visual Studio에서 웹 응용 프로그램 프로젝트는 기본적으로 *. * proj 파일을 얻지 못하므로 배포 스크립트를 만들기 위해 MSBuild를 실행하는 방법을 알아내는 데 큰 어려움이있었습니다.
  • NAnt는 Visual Studio에 기본 제공되지 않으므로 추가 기능을 사용하거나 "외부 도구"로 추가해야합니다. 이것은 약간의 고통입니다.
  • (편집 :) 내 동료 중 한 명이 이것을 가져 왔습니다. 연속 통합을 위해 CruiseControl 을 사용하여 빌드 머신을 설정하려는 경우 CruiseControl은 즉시 NAnt와 통합됩니다. 업데이트 : CruiseControl에는 MSBuild 작업도 있습니다.
  • 주관적 차이에 대한 전체 및 최신 토론은 아래 의견을 참조하십시오.

.proj 파일을 편집 할 수 있지만 프로젝트를 언로드 한 후 (프로젝트의 상황에 맞는 메뉴에 "언로드"옵션이 있어야 함)
Yordan Pavlov

18
@Yordan : 또는 사용자 정의를 별도의 .build 파일 (또는 무엇이든)에 넣고 .csproj 파일에서 가져 오기 + 실행하십시오. 그런 다음 .csproj를 한 번만 편집하면 .build 파일을 솔루션에 추가 할 수 있습니다. 두 번 클릭하면 다른 파일처럼 편집됩니다. 옵션에서 .build 파일을 XML 편집기에 매핑 할 수 있습니다.
Kent Boogaart

9
: 세부 사항은에서 찾을 수 있습니다 - MSBuild를 CCNet 작업이 존재 confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task
개빈 밀러

2
.csproj 파일 자체를 수정할 필요는 없습니다. MyProject.csproj.user 파일을 사용하여 수정 작업을 수행하면 .csproj 파일을 깨끗하고 깨끗하게 유지할 수 있습니다. MSBuild는 이러한 .user 파일을 찾아서 빌드 프로세스로 자동으로 가져옵니다. 참조 : ahmed0192.blogspot.com/2006/11/…
CleverPatrick

3
@CleverHuman, .user 파일에는 일반적으로 프로젝트의 나머지 부분과 함께 체크인하지 않는 프로젝트에 대한 사용자 특정 모드가 포함되어 있지 않습니까? 나는 수년간 Kent의 제안을 사용했으며 매우 잘 작동합니다. PROJ 파일을 한 번 수정하여 두 번째 PROJ 파일을 포함시킨 다음 두 번째 PROJ 파일을 프로젝트에 추가하십시오. 그런 다음 언로드 / 리로드 프로세스를 거치지 않고도 두 번째 PROJ 파일을 쉽게 사용자 정의 할 수 있습니다. 나는 이런 이유로 MSBuild에 의존하는 경향이 있습니다.
DarinH

77

Windows 플랫폼에서 MSBuild의 주요 장점 중 하나는 .NET 자체의 일부로 제공된다는 것입니다. 즉, Windows Update가 최신 인 모든 Windows 컴퓨터에는 MSBuild를 사용할 수 있습니다. 여기에 C # 컴파일러도 .NET 자체의 일부이며 깨끗한 시스템에서 프로젝트를 빌드 할 수있는 플랫폼이 있습니다. Visual Studio behemoth를 설치할 필요가 없습니다. 반면 NAnt는 빌드를 트리거하기 전에 명시 적으로 설치해야합니다.

기록을 위해 과거에 사소한 빌드에서 NMake, Make, Ant, Rake, NAnt 및 MSBuild를 순서대로 사용했습니다. 내가 가장 좋아하는 것은 MSBuild입니다. "Visual Studio에서 사용하는 것이기 때문에 선호하지 않습니다." IMHO, 그것은 매우 평가되지 않은 빌드 도구입니다.

NAnt와 MSBuild를 절차 적 프로그래밍과 기능적 프로그래밍의 차이점과 비교합니다. NAnt는 매우 간단하고 쉽게 볼 수 있습니다. 반면에 MSBuild는 좀 더 많은 생각이 필요합니다. 학습 곡선이 더 가파 릅니다. 그러나 일단 "얻으면"놀라운 일을 할 수 있습니다.

따라서 기능적 또는 논리적 스타일 프로그래밍을 선호하는 경우 MSBuild를 살펴 보는 것이 좋습니다. 유형 결과를보기 전에 약간의 시간과 노력을 투자하려는 경우 (물론, 결국 투자가 수익을 거두고 있다고 생각합니다. 더 강력한 일을 더 효율적으로 할 수 있습니다).


11
와! MSBuild가 런타임과 함께 제공된다는 것을 몰랐습니다. 그것은 꽤 시원하고 나는 분명히 이점을 볼 수 있습니다. 그러나 기능 / 절차의 비교를 이해하지 못합니다. MSBuild가 일단 "얻으면"훨씬 더 강력한 기능이 무엇인지 들으면 흥미로울 것입니다.
Scott Saad

2
Msbuild는 실제로 특정 대상을 호출하는 동안에 만 나타나는 다양한 SDK의 파일에 대한 많은 종속성을 가지고 있습니다. 따라서 msbuild는 기본적으로 제공되지만 실행되지 않을 수 있습니다.
Sam Shiles

6
추가해야 할 한 가지 : msbuild 내에서 .NET 어셈블리를 호출 할 수있을뿐만 아니라 매우 유용한 많은 함수에 대한 액세스를 제공합니다 (예 : Systme.IO.Path의 모든 것이 빌드 스크립트에 유용 할 수 있음) msbuild 파일 내에 일반 C # 코드를 작성하여 실행할 수도 있습니다. 단순히 굉장합니다. msdn.microsoft.com/ko-kr/library/dd722601.aspx 그리고 상황이 너무 복잡해지면 사용자 지정 작업을 작성하는 것도 쉬워집니다.
stijn

1
Wikipedia에서 : " MSBuild 는 이전에 .NET Framework와 함께 번들로 제공되었지만 Visual Studio 2013부터는 Visual Studio와 함께 번들로 제공됩니다."
DavidRR

MSBuild (Microsoft Build Tools 2013)는 Visual Studio 2013과 독립적으로 여기에서 다운로드 할 수도 있습니다 .
DavidRR

45

개인적으로, 나는 같은 프로젝트에 둘 다 사용합니다.

MSBuild는 Visual Studio 솔루션 및 프로젝트 구축에 탁월합니다. 그것이 바로 그 목적입니다.

NAnt은 더 쉽게 손으로 편집 할 수 있습니다. 특히 Ant를 이미 알고 있다면 더욱 그렇습니다. NAnt는 NAntContrib로 MSBuild를 매우 쉽게 호출 할 수 있습니다. 따라서 빌드 된 파일 복사, 정리 등의 작업을 수행하는 NAnt 스크립트를 직접 작성하고 MSBuild를 호출하여 실제 "C # 소스 코드를 어셈블리로 변환"부분을 수행합니다.

그 예를 원하면 내 프로토콜 버퍼 빌드 파일을보십시오 . (나는 그것이 멋진 NAnt 스크립트라고 주장하지는 않지만 일을한다.)


1
그리고 모노를 지원합니다. 모노의 MSBuild 지원은 엉망입니다.
Mehrdad Afshari 2016 년

@Mehrdad이 : 네, 어떤 시점에서 정말 모노에서 컴파일 프로토콜 버퍼를 얻기 위해 시도해야 ... 현재 아이디어는 언제나 :( 작동을 멈추는 gmcs 버그가있다는 모노에 궁극적으로 작업하지만 것이다.
존을 Skeet

1
여러분, mono는 XBuild를 사용하며 MSBuild를 XBuild로 쉽게 포팅 할 수 있습니다. 이것을 확인하십시오 : mono-project.com/Porting_MSBuild_Projects_To_XBuild .
fyasar

20

NAnt 는 기본적으로 더 많은 기능을 제공하지만 MSBuild 는 훨씬 더 나은 기본 구조 (항목 메타 데이터 락)를 사용하여 재사용 가능한 MSBuild 스크립트를 훨씬 쉽게 작성할 수 있습니다.

MSBuild는 이해하는 데 시간이 걸리지 만 일단 그렇게하면 매우 좋습니다.

학습 자료 :


38
이봐, 난 :) 그 책 들었어요
사예드 이브라힘 하시

19

KISS = MSBuild 사용

상자에서 합리적인 작업을 수행 할 무언가가있을 때 왜 믹스에 다른 것을 추가해야합니까? MSBuild가 도착하자 NAnt는 사망했습니다. 그리고 Mono 는 MSBuild 구현 ( xbuild )을 갖습니다 .

DRY = MSBuild를 사용하십시오.

빌드 시스템에서 무엇을 원하십니까? 두 가지 구성을 유지 관리하는 대신 IDE에서 사용하는 빌드 시스템을 원합니다 .

개인적으로 NAnt에 대한 실제 주장을 듣고 싶습니다. 왜냐하면 실제로 물을 보유하고있는 것을 생각할 수 없기 때문입니다.


2
"msbuild가 도착하면 낭트가 죽었다"-VS가 없어도 클린 처라고 생각합니다 (사용하지 않습니다).
harpo

나는 동의한다. DotNet 1.1에는 msbuild.exe가 없습니다. 그래서 우리는 그때 망했다. 2.0 이후로 msbuild.exe 및 추가 라이브러리가 많이 사용됩니다. 그리고 커스텀 MsBuild-Task를 작성하는 데는 학습 곡선이 있지만 몇 년 동안 10 개 정도를 작성했습니다.
granadaCoder 2016 년

1
동의합니다. 빌드 서버가 더 빨리 실패 할 수 있도록하는 것과 동일한 도구를 사용하여 개발자로 빌드해야합니다.
krystan honor

14

여러 포스터에서 언급 한 한 가지 사실은 .csproj (또는 .vbproj 등) 파일을 직접 편집해야한다는 것입니다.

MSBuild를 사용하면 .user 파일을 사용하여 이러한. * proj 파일을 사용자 지정할 수 있습니다. 나는라는 이름의 프로젝트가있는 경우 MyCreativelyNamedProject.csproj을 그것의 내부의 MSBuild 작업을 사용자 정의 할, 나는라는 이름의 파일을 생성 할 수 있습니다 MyCreativelyNamedProject.csproj.user을 하고 사용 CustomBeforeMicrosoftCommonTargetsCustomAfterMicrosoftCommonTargets을 해당 파일을 사용자 정의 할 수 있습니다.

또한 NAnt 및 MSBuild는 모두 사용자 지정 MSBuild 작업 및 NantContrib 확장을 통해 심장의 내용에 맞게 사용자 지정할 수 있습니다.

따라서 NAnt 또는 MSBuild를 사용하면 실제로 익숙해집니다.

  • Ant에 이미 익숙한 경우 NAnt를 사용하십시오. 학습 곡선은 매우 쉽습니다.
  • 두 도구 중 하나에 익숙하지 않은 경우 MSBuild는 이미 Visual Studio와 통합되어 있으며 추가 도구가 필요하지 않습니다.

또한 MSBuild는 모든 새로운 버전의 .NET 및 Visual Studio가 출시되는 즉시 작동하도록 보장 되지만 NAnt는 약간의 지연이있을 수 있습니다.


1
.net 릴리스와 nant 릴리스 사이의 지연을 지적하기 위해 +1. .net 3.5가 나왔을 때 인터넷에서 해킹 된 nant.exe.config를 사용하여 작업을 수행해야 할 때를 기억합니다. 재미 없어.
mmacaulay

9
주변의 많은 게시물에 따르면, 그 .USER 파일에는 체크인하지 않아야 할 + user specific info +가 포함되어 있으므로 빌드 사용자 정의를 마지막으로하고 싶습니다 ... 정의에 따른 모든 빌드 사용자 정의 사용자별로 다르므로 .user 파일에 들어가면 안됩니다 ...
DarinH

1
drventure에 동의하십시오; .user-files는 이름이 pr user를 암시하는 것처럼 소스 제어 저장소에 체크인해서는 안됩니다. 이것은 빌드를 자동화하는 장소가 아닙니다.
Kjetil Klaussen

10

NAnt 스크립트가 MSBuild를 호출 한다는 점에서 두 가지를 모두 사용합니다 . NAnt를 유지하는 나의 주된 이유는 고립 입니다. 이것이 왜 중요하다고 생각하는지 설명하겠습니다.

  1. 프로젝트에 의존성 추가. NAnt 빌드 파일은 Visual Studio에 익숙하지 않으므로 (제 경우에는 전문가라고 생각합니다) Visual Studio는 아무것도하지 않습니다. MSBuild 작업은 솔루션의 일부로 포함되므로 다른 MSBuild 작업을 참조 할 수 있습니다. MSBuild 커뮤니티 작업이 설치되지 않았기 때문에 빌드 할 수 없다는 것을 알기 위해 다른 사람으로부터 소스 코드를 받았습니다. 내가 특히 실망스럽게 생각하는 것은 Visual Studio가 빌드하지 않고 디버깅을 느슨하게하는 많은 오류를 발생시키지 않았다는 것입니다. 이것은 요청되는 빌드가 MSBuild 작업의 추가 사항없이 (예를 들어 디버그 빌드로) 진행될 수 있다는 사실에도 불구하고. 간단히 말해서 : 피할 수 있다면 프로젝트에 종속성을 추가하는 것을 좋아하지 않습니다 .

  2. 개발 팀을 던질 수있는 한 Visual Studio를 신뢰하지 않습니다. 이것은 HTML을 대량 학살 할 때 Visual Studio의 초기 시절로 이어집니다. 나는 여전히 예를 들어 디자이너를 사용하지 않습니다 (최근 회의에서 동료들도 같은 것을 발견했습니다). Visual Studio가 DLL 파일의 종속성과 버전 번호를 망칠 수 있음을 발견했습니다 (이를 복제 할 수는 없지만 프로젝트에서 일관되게 발생하여 많은 슬픔과 시간을 낭비했습니다). Visual Studio를 사용하여 디버그 모드로만 빌드하는 빌드 절차를 사용했습니다. 생산을 위해 NAnt를 사용하여 모든 것을 외부에서 제어 합니다. NAnt를 사용하여 빌드하면 Visual Studio가 더 이상 방해 할 수 없습니다.

추신 : 저는 웹 개발자이며 Windows Forms 개발을하지 않습니다.


6

MsBuild에 익숙하지는 않지만 양쪽의 주요 차이점 중 일부를 추가로 보완 할 수 있다는 인상을 받았습니다.

최근에 Nant에 Silverlight 프로젝트를 구축해야했습니다. 방금 MsBuild 로이 작업을 수행하면 인생이 더 쉬울 것이라는 것을 알았습니다 .Nant 스크립트 내에서 MsBuild 작업을 호출하여 두 가지를 혼합하고 일치시키는 것이 너무 평범하지 않다고 생각했습니다.

그 외에도 개인 취향의 문제가 될 것이라고 생각합니다. 분명히 Visual Studio 내에서 MsBuild의 기능 중 일부 / 대부분을 관리 할 수 ​​있습니다. Nant는 스크립트를 직접 작성하는 것을 선호하는 경우 더 유연하고 더 적합 해 보입니다. Java 세계에서 온 사람이라면 집에있을 것입니다.


좋은 지적. 두 솔루션 모두 원하는 방식으로 쉽게 확장하고 사용자 정의 할 수 있습니다.
CleverPatrick

2

나는 둘 다 사용했다. 빌드 시스템을 재 설계 할 때 까다로운 문제가 발생했습니다. 즉, 우리 모두가 VS를 사용하여 프로젝트 파일, 설정 및 구성을 업데이트했기 때문에 .vcproj (및 제품군)를 제거 할 수 없었습니다. 따라서 중복 및 오류가 발생하기 쉬운 프로세스가 없으면 빌드 시스템을 새로운 파일 세트에 기반을 둘 수 없었습니다.

이런 이유로 나는 VS의 'proj'파일을 유지하고 MSBuild를 사용하기로 결정했습니다 (MSBuild 파일은 적어도 VS2005 및 VS2008은 MSBuild 프로젝트 파일을 사용합니다). 그 밖의 모든 것 (맞춤 구성, 단위 테스트, 포장, 문서 준비 ...)에 NAnt를 사용했습니다.

지속적인 통합을 위해 CruiseControl을 사용했습니다. 그래서 우리는 MSBuild를 사용하는 NAnt 작업을 트리거하는 CC 스크립트를 가지고있었습니다.

마지막 참고 사항 : MSBuild는 설치 프로젝트를 지원하지 않습니다! 따라서 DevEnv.com을 호출하거나 Visual Studio를 직접 사용하는 데 어려움이 있습니다. 이것이 내가 한 일이지만 개발자가 일반적으로 빌드 할 필요가 없으므로 빌드 할 때 수동으로 선택할 수 있기 때문에 모든 솔루션 구성에서 기본적으로 설치 프로젝트를 비활성화했습니다.



1

NAnt에 사용할 수있는 설명서 및 자습서를 통해 NAnt를 사용하여 빌드 스크립트 학습을보다 쉽게 ​​시작할 수 있습니다. NAnt가 중단되고 빌드 스크립트를 만들면 해당 지식을 MSBuild로 변환하기 시작했습니다 (NAnt에서 X를 수행했습니다. MSBuild에서 X를 어떻게 수행합니까?). Microsoft의 문서는 일반적으로 유용하기 전에 상당히 높은 수준의 지식을 가정합니다.

NAnt에서 MSBuild로 전환하는 이유는 MSBuild가 최신 버전이기 때문입니다. 불행히도 NAnt의 마지막 릴리스는 2007 년 12 월 8 일 이었지만 MSBuild 4.0 (.NET 4.0)은 그리 멀지 않았습니다. NAnt 프로젝트가 종료 된 것 같습니다.

MSBuild를 사용하여 빌드 스크립트 작성을 배우기 시작한 누군가를위한 좋은 문서를 찾으면 NAnt를 건너 뛰고 MSBuild로 바로 이동하십시오. NAnt가 새로운 릴리스를 내 놓으면 NAnt를 고수하는 것을 고려할 것이지만 지금은 뒤쳐져 있습니다.


1
2012 년 6 월 현재 NAnt 버전 0.92는 웹 사이트 ( nant.sourceforge.net) 에서 제공되며 .Net 4.0을 지원합니다.
Brett Rigby

0

우리는 둘 다 사용합니다. NAnt는 복사, IIS 배포와 같은 모든 "스크립트"작업을 담당 합니다. 에서의 , 패키지 작성 담당하고 MSBuild는 솔루션을 작성합니다. 그러면 새로운 버전의 NAnt에 의해 지원되지 않는 .NET 4.0 문제를 피할 수 있습니다.

NAnt도 확장 성이 뛰어납니다. 배포 스크립트를 프로덕션 서버로 마이그레이션하려는 경우 빌드 파일 만 복사하고 적절한 .NET 버전을 설치합니다. csproj 파일에는 Visual Studio 문제가 없습니다.)


0

YDeliver 마노로는 PSake 위에 구축 빌드 프레임 워크입니다. 이 라이브러리에는 다양한 라이브러리 기능, 워크 플로우 정의 기능이 있으며이를 통해 6 개 이상의 엔터프라이즈 프로젝트를 프로덕션에 제공했습니다.

TeamCity , CruiseControl 또는 PowerShell 을 실행할 수있는 모든 것과 함께 사용하십시오 .


0

우리는 FlubuCore를 사용합니다. C # 코드를 사용하여 프로젝트를 빌드하고 배포 스크립트를 실행하기위한 오픈 소스 C # 라이브러리입니다.

flubu가 사용되는 간단한 예 :

protected override void ConfigureTargets(ITaskContext session)
{           

    var compile = session.CreateTarget("compile")
        .SetDescription("Compiles the solution.")
        .AddTask(x => x.CompileSolutionTask())
        .DependsOn("generate.commonassinfo");
}

flubu에 대한 자세한 정보와 시작 방법은 여기에서 확인할 수 있습니다. choice-for-build-tool-msbuild-nant 또는 something

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.