NAnt hoặc MSBuild, nên chọn cái nào và khi nào?


160

Tôi biết có những câu hỏi khác liên quan đến NAntMSBuild trên Stack Overflow, nhưng tôi không thể tìm thấy sự so sánh trực tiếp giữa hai câu hỏi và đây là câu hỏi.

Khi nào nên chọn NAnt trên MSBuild? Cái nào tốt hơn để làm gì? NAnt có phù hợp hơn cho các dự án gia đình / nguồn mở và MSBuild cho các dự án làm việc không? Kinh nghiệm với bất kỳ trong hai là gì?

Câu trả lời:


97

Tôi đã thực hiện một cuộc điều tra tương tự trong tuần này. Đây là những gì tôi có thể xác định:

NAnt:

  • Đa nền tảng (hỗ trợ Linux / Mono). Nó có thể thuận tiện cho việc cài đặt một trang web cho nhiều mục tiêu (ví dụ, Linux Apache và Windows IIS), chẳng hạn.
  • Cú pháp tương tự 95% với Ant (dễ dàng cho người dùng Ant hiện tại hoặc người xây dựng Java)
  • Tích hợp với NUnit để chạy thử nghiệm đơn vị như là một phần của bản dựng và với NDoc cho tài liệu sản xuất.

MSBuild:

  • Được tích hợp sẵn vào .NET.
  • Tích hợp với Visual Studio
  • Dễ dàng bắt đầu với MSBuild trong Visual Studio - tất cả chỉ là hậu trường. Nếu bạn muốn tìm hiểu sâu hơn, bạn có thể chỉnh sửa các tập tin.

Sự khác biệt chủ quan: (YMMV)

  • Tài liệu NAnt đơn giản hơn một chút. Ví dụ: Tham chiếu tác vụ MSBuild liệt kê "Tác vụ Csc - Mô tả tác vụ Csc và các tham số của nó." (Cảm ơn "trợ giúp"?), So với Tham chiếu tác vụ NAnt "csc - Biên dịch chương trình C #." CẬP NHẬT: Tôi đã nhận thấy tài liệu MSBuild đã được cải thiện và tốt hơn nhiều (có lẽ ngang bằng với NAnt).
  • Không dễ để tìm ra cách chỉnh sửa nguồn tập lệnh xây dựng (*. * Tệp proj) trực tiếp từ bên trong Visual Studio. Với NAnt, tôi chỉ có Visual Studio coi tập lệnh .build như một tệp XML.
  • Rõ ràng, trong Visual Studio, các dự án ứng dụng web không có tệp proj *. * Theo mặc định, vì vậy tôi gặp khó khăn lớn khi tìm cách thậm chí để MSBuild chạy trên máy của tôi để tạo tập lệnh triển khai.
  • NAnt không được tích hợp vào Visual Studio và phải được thêm vào, bằng bổ trợ hoặc là "Công cụ bên ngoài". Đây là một chút đau đớn để thiết lập.
  • (Chỉnh sửa :) Một trong những đồng nghiệp của tôi đã đưa ra điều này - nếu bạn muốn thiết lập một máy xây dựng bằng CruiseControl để tích hợp liên tục, CruiseControl tích hợp với NAnt độc đáo. CẬP NHẬT: CruiseControl cũng có một nhiệm vụ MSBuild .
  • Xin vui lòng xem ý kiến ​​dưới đây để thảo luận đầy đủ và cập nhật về sự khác biệt chủ quan.

bạn có thể chỉnh sửa tệp .proj nhưng sau khi bạn hủy dự án (cần có tùy chọn "Unload" trong menu ngữ cảnh cho dự án)
Yordan Pavlov

18
@Yordan: hoặc chỉ cần đặt các tùy chỉnh của bạn vào một tệp .build riêng (hoặc bất cứ thứ gì) và nhập + thực hiện điều đó từ tệp .csproj của bạn. Sau đó, bạn chỉ phải chỉnh sửa .csproj một lần và có thể thêm tệp .build vào giải pháp của mình. Nhấp đúp chuột và bạn đang chỉnh sửa như bất kỳ tệp nào khác. Có thể ánh xạ các tệp .build sang trình soạn thảo XML trong các tùy chọn của bạn.
Kent Boogaart

9
Tồn tại một nhiệm vụ CCNet của MSBuild - Các chi tiết có thể được tìm thấy tại: confluence.public
Gavin Miller

2
Điều đáng chú ý là bạn không cần phải sửa đổi các tệp .csproj. Bạn có thể sử dụng tệp MyProject.csproj.user để thực hiện các sửa đổi đó, để tệp .csproj của bạn sạch sẽ và nguyên sơ. MSBuild biết tìm kiếm các tệp .user đó và sẽ tự động nhập chúng vào quá trình xây dựng. Xem: ahmed0192.blogspot.com/2006/11/ khăn
CleverPatrick

3
@CleverHuman, không phải tệp .user đó thường chứa các mod cụ thể của người dùng cho dự án mà bạn thường không đăng ký cùng với phần còn lại của dự án? Tôi đã sử dụng đề xuất của Kent trong nhiều năm và nó hoạt động rất độc đáo. Bạn sửa đổi tệp PROJ một lần để bao gồm tệp PROJ thứ hai, sau đó thêm tệp PROJ thứ hai vào dự án của bạn. Từ đó trở đi, bạn có thể dễ dàng tùy chỉnh tệp PROJ thứ hai mà không phải trải qua quá trình Unload / tải lại đó. Tôi có xu hướng nghiêng về MSBuild chỉ vì lý do này.
DarinH

77

Một trong những điểm thu hút chính của MSBuild đối với tôi (trên nền tảng Windows) là nó là một phần của chính .NET. Điều đó có nghĩa là bất kỳ máy Windows nào được cập nhật với Windows Update đều sẽ có sẵn MSBuild. Thêm vào đó là thực tế rằng trình biên dịch C # cũng là một phần của chính .NET và bạn có một nền tảng có thể xây dựng các dự án trên các máy sạch. Không cần phải cài đặt Visual Studio. NAnt, mặt khác, phải được cài đặt rõ ràng trước khi có thể kích hoạt bản dựng.

Chỉ để ghi lại, tôi đã sử dụng NMake, Make, Ant, Rake, NAnt và MSBuild trên các bản dựng không tầm thường trong quá khứ (theo thứ tự đó). Sở thích của tôi là MSBuild, thực tế (và tôi không thích nó vì "đó là những gì Visual Studio sử dụng"). IMHO, nó là một công cụ xây dựng được đánh giá rất thấp.

Tôi sẽ so sánh NAnt và MSBuild với sự khác biệt giữa lập trình thủ tục và chức năng. NAnt khá đơn giản và bạn có được những gì bạn thấy. MSBuild mặt khác đòi hỏi một chút suy nghĩ. Đường cong học tập dốc hơn. Nhưng một khi bạn "hiểu được", bạn có thể làm một số điều tuyệt vời với nó.

Vì vậy, tôi khuyên bạn nên xem MSBuild nếu bạn cũng hướng đến lập trình theo phong cách chức năng hoặc logic - nếu bạn sẵn sàng đầu tư một chút thời gian và nỗ lực trước khi thấy kết quả rõ ràng (tất nhiên, tôi cũng tin tưởng mạnh mẽ rằng đầu tư cuối cùng cũng được đền đáp có thể làm những việc mạnh mẽ hơn hiệu quả hơn).


11
Ồ Không biết rằng MSBuild đã xuất xưởng cùng với thời gian chạy. Điều đó khá tuyệt và tôi chắc chắn có thể thấy lợi ích ở đó. Tuy nhiên, tôi không hiểu so sánh giữa chức năng / thủ tục. Thật thú vị khi nghe điều gì làm cho MSBuild trở nên mạnh mẽ hơn nhiều khi một người "hiểu được".
Scott Saad

2
Msbuild thực sự có một số phụ thuộc vào các tệp từ các sd khác nhau, điều này chỉ trở nên rõ ràng trong quá trình gọi các mục tiêu nhất định. Vì vậy, mặc dù msbuild có sẵn trong hộp, nó có thể không chạy.
Sam Shiles

6
một điều cần được thêm vào: không chỉ có thể gọi vào các cụm .NET từ trong msbuild, cho phép một người truy cập vào rất nhiều chức năng rất tiện dụng (ví dụ: mọi thứ trong Systme.IO.Path đều có thể có ích trong các tập lệnh xây dựng) , cũng có thể viết mã C # đơn giản trong các tệp msbuild và thực thi nó. Mà đơn giản là aswgie. msdn.microsoft.com/en-us/l Library / dd722601.aspx Và nếu mọi thứ trở nên quá phức tạp, việc viết các tác vụ tùy chỉnh cũng rất dễ dàng.
stijn

1
Từ Wikipedia: " MSBuild trước đây được gói cùng với .NET Framework; bắt đầu với Visual Studio 2013, tuy nhiên, nó được đóng gói với Visual Studio thay thế."
DavidRR

MSBuild (Microsoft Build Tools 2013) cũng có thể được tải xuống độc lập với Visual Studio 2013 tại đây .
DavidRR

45

Cá nhân, tôi sử dụng cả hai - cho cùng một dự án.

MSBuild rất giỏi trong việc xây dựng các giải pháp và dự án Visual Studio - đó là những gì nó được tạo ra.

NAnt dễ dàng chỉnh sửa bằng tay hơn, theo ý kiến ​​của tôi - đặc biệt nếu bạn đã biết Ant. NAnt có thể gọi MSBuild rất dễ dàng với NAntContrib. Vì vậy, tôi tự tạo một tập lệnh NAnt để thực hiện các thao tác như sao chép các tệp được xây dựng, dọn dẹp, v.v. - và gọi MSBuild để thực hiện phần "biến mã nguồn C # của tôi thành tập hợp".

Nếu bạn muốn có một ví dụ về điều đó, hãy xem tệp xây dựng Bộ đệm giao thức của tôi . (Tôi sẽ không cho rằng đó là một kịch bản NAnt tuyệt vời, nhưng nó thực hiện công việc.)


1
Và nó hỗ trợ Mono. Hỗ trợ MSBuild của Mono là crappy.
Mehrdad Afshari

@Mehrdad: Vâng, đôi khi tôi thực sự phải cố gắng để Bộ đệm giao thức biên dịch trên Mono ... hiện tại có một lỗi gmcs ngăn nó hoạt động :( Mặc dù vậy, ý tưởng luôn luôn là nó sẽ hoạt động trên Mono.
Jon Xiên

1
Các bạn, mono sử dụng XBuild và thật dễ dàng để chuyển MSBuild sang XBuild. Hãy xem điều này: mono-project.com/Porting_MSBuild_Projects_To_XBuild .
fyasar

20

NAnt có nhiều tính năng hơn, nhưng MSBuild có cấu trúc cơ bản tốt hơn nhiều (đá siêu dữ liệu vật phẩm) giúp việc xây dựng các tập lệnh MSBuild có thể tái sử dụng dễ dàng hơn nhiều.

MSBuild cần một chút thời gian để hiểu, nhưng một khi bạn làm điều đó rất tốt.

Tài liệu học tập:


38
Này, tôi đã nghe nói về những cuốn sách đó :)
Ibrahim Hashimi đã nói

19

KISS = Sử dụng MSBuild.

Tại sao thêm một cái gì đó khác vào hỗn hợp khi bạn có một cái gì đó sẽ làm một công việc hợp lý ra khỏi hộp? Khi MSBuild đến, NAnt đã chết. Và Mono sẽ có một triển khai MSBuild, ( xbuild ).

DRY = Sử dụng MSBuild.

Hãy tự hỏi bạn muốn gì từ một hệ thống xây dựng? Tôi muốn một hệ thống xây dựng cũng được IDE của tôi sử dụng thay vì duy trì hai cấu hình khác nhau.

Cá nhân, tôi rất thích nghe một số lập luận thực sự cho NAnt, vì tôi không thể nghĩ ra bất kỳ điều gì thực sự giữ nước.


2
"Khi msbuild gặp khó khăn, nant đã chết" - Tôi nghĩ rằng đây là móc sắt, ngay cả khi không có VS (mà tôi không sử dụng).
harpo

Tôi đồng ý. DotNet 1.1 không có msbuild.exe. Vì vậy, chúng tôi đã được vít trở lại sau đó. Kể từ 2.0, msbuild.exe và các thư viện bổ sung làm rất nhiều. Và viết một MsBuild-Task tùy chỉnh có một lộ trình học tập, nhưng tôi đã viết khoảng 10 trong số đó trong những năm qua.
granadaCoder

1
Tôi phải đồng ý, bạn nên sử dụng cùng một công cụ để xây dựng như một nhà phát triển vì máy chủ xây dựng sẽ sử dụng cho phép bạn thất bại nhanh hơn.
kirtan vinh dự

14

Một điều tôi nhận thấy một số áp phích đề cập là phải chỉnh sửa các tệp .csproj (hoặc .vbproj, v.v.).

MSBuild cho phép tùy chỉnh các tệp. * Proj này thông qua việc sử dụng các tệp .user. Nếu tôi có một dự án có tên MyCreativelyNamedProject.csproj và muốn tùy chỉnh các nhiệm vụ MSBuild bên trong của nó, tôi có thể tạo một file có tên MyCreativelyNamedProject.csproj.user và sử dụng CustomBeforeMicrosoftCommonTargetsCustomAfterMicrosoftCommonTargets để tùy chỉnh các tập tin.

Ngoài ra, cả NAnt và MSBuild đều có thể được tùy chỉnh theo nội dung của trái tim thông qua các tác vụ MSBuild tùy chỉnh và thông qua các phần mở rộng của NantContrib.

Vì vậy, sử dụng NAnt hoặc MSBuild thực sự trở nên quen thuộc:

  • Nếu bạn đã quen thuộc với Ant, hãy sử dụng NAnt. Các đường cong học tập sẽ rất dễ dàng.
  • Nếu bạn không quen thuộc với một trong hai công cụ, MSBuild đã được tích hợp với Visual Studio và không yêu cầu thêm công cụ nào.

Cũng đáng bổ sung rằng MSBuild được đảm bảo khá nhiều để hoạt động với tất cả các phiên bản .NET và Visual Studio mới ngay khi chúng được phát hành, trong khi NAnt có thể có một số độ trễ.


1
+1 để chỉ ra độ trễ giữa các bản phát hành .net và bản phát hành cần thiết. Tôi nhớ khi .net 3.5 xuất hiện và phải sử dụng nant.exe.config đã hack từ trên mạng để mọi thứ hoạt động. Không vui.
mmacaulay

9
Theo nhiều bài đăng ở đây, các tệp .USER đó chứa + thông tin cụ thể của người dùng + không nên đăng ký, vì vậy đó sẽ là nơi cuối cùng tôi muốn đặt các tùy chỉnh xây dựng ... Bất kỳ tùy chỉnh xây dựng nào theo định nghĩa không nên 'không phải là người dùng cụ thể, và vì vậy không nên truy cập vào các tệp .user đó ...
DarinH

1
Đồng ý với quyết định; .user-files là tên gợi ý người dùng pr và chúng thậm chí không nên được kiểm tra trong kho lưu trữ kiểm soát nguồn của bạn. Đây KHÔNG phải là nơi để tự động hóa việc xây dựng.
Kjetil Klaussen

10

Tôi sử dụng cả hai trong đó các tập lệnh NAnt của tôi gọi MSBuild. Lý do chính của tôi để ở với NAnt là sự cô lập . Hãy để tôi giải thích lý do tại sao tôi cảm thấy điều này là quan trọng:

  1. Thêm phụ thuộc vào dự án của bạn. Tệp xây dựng NAnt xa lạ với Visual Studio (trong trường hợp của tôi, tôi coi đây là bản pro) vì vậy Visual Studio không cố gắng làm bất cứ điều gì với nó. Các tác vụ MSBuild được nhúng để là một phần của giải pháp và có thể tham khảo các tác vụ MSBuild khác. Tôi đã nhận được mã nguồn từ người khác chỉ để biết rằng tôi không thể xây dựng, vì các tác vụ cộng đồng MSBuild chưa được cài đặt. Điều tôi cảm thấy đặc biệt khó chịu là Visual Studio sẽ không xây dựng và gây ra một loạt lỗi khiến tôi mất thời gian gỡ lỗi. Điều này, mặc dù thực tế là bản dựng được yêu cầu có thể đã đi trước (ví dụ như bản dựng gỡ lỗi) mà không có một số tính năng bổ sung của tác vụ MSBuild. Tóm lại: Tôi không thích thêm phụ thuộc vào dự án của mình nếu tôi có thể tránh được .

  2. Tôi không tin tưởng Visual Studio khi có thể ném đội ngũ phát triển của nó. Điều này bắt nguồn từ những ngày đầu của Visual Studio khi nó sẽ tàn sát HTML của tôi. Tôi vẫn không sử dụng nhà thiết kế chẳng hạn (tại một cuộc hội thảo gần đây tôi thấy các đồng nghiệp cũng làm như vậy). Tôi đã thấy rằng Visual Studio có thể làm hỏng các phụ thuộc và số phiên bản trong tệp DLL (tôi không thể sao chép điều này, nhưng nó đã xảy ra trong một dự án một cách nhất quán và gây ra nhiều đau buồn và mất thời gian). Tôi đã sử dụng một quy trình xây dựng chỉ sử dụng Visual Studio để xây dựng ở chế độ gỡ lỗi. Đối với sản xuất, tôi sử dụng NAnt để tôi kiểm soát mọi thứ bên ngoài . Visual Studio không thể can thiệp được nữa nếu tôi xây dựng bằng NAnt.

PS: Tôi là nhà phát triển web và không phát triển Windows Forms.


6

Mặc dù tôi không quen thuộc lắm với MsBuild, nhưng tôi có ấn tượng rằng một số khác biệt chính ở cả hai bên có thể được bổ sung bằng các bổ sung:

Gần đây tôi đã phải xây dựng một dự án Silverlight ở Nam Thông. Tôi phát hiện ra rằng cuộc sống sẽ dễ dàng hơn nếu tôi làm điều này với MsBuild - cuối cùng tôi đã gọi một nhiệm vụ MsBuild từ trong một kịch bản tiếng Nam vì vậy tôi cho rằng nó không quá khác thường để trộn và kết hợp cả hai.

Ngoài ra, tôi cho rằng đó sẽ là một câu hỏi về sở thích cá nhân - rõ ràng bạn có thể quản lý một số / hầu hết các chức năng của MsBuild từ trong Visual Studio, nếu đó là việc của bạn. Nant có vẻ linh hoạt hơn và phù hợp hơn nếu bạn thích viết kịch bản bằng tay và nếu bạn đến từ thế giới Java, bạn có thể sẽ ở nhà với nó.


Điểm tốt. Cả hai giải pháp có thể dễ dàng được mở rộng và tùy chỉnh theo bất kỳ cách nào mong muốn.
CleverPatrick

2

Tôi đã kết thúc bằng cách sử dụng cả hai. Khi thiết kế lại hệ thống xây dựng của chúng tôi, tôi đã phải đối mặt với một vấn đề khó khăn. Cụ thể, tôi không thể thoát khỏi .vcproj (và gia đình) vì mọi người chúng tôi đang sử dụng VS để cập nhật các tệp dự án, cài đặt và cấu hình. Vì vậy, không có quá trình trùng lặp và lỗi dễ xảy ra, chúng tôi không thể dựa vào hệ thống xây dựng của mình trên một tập tin mới.

Vì lý do này, tôi quyết định giữ các tệp 'proj' của VS và sử dụng MSBuild (chúng là các tệp MSBuild, ít nhất là VS2005 và VS2008 sử dụng các tệp dự án MSBuild). Đối với mọi thứ khác (cấu hình tùy chỉnh, kiểm tra đơn vị, đóng gói, chuẩn bị tài liệu ...) Tôi đã sử dụng NAnt.

Để tích hợp liên tục, tôi đã sử dụng CruiseControl. Vì vậy, chúng tôi đã có các tập lệnh CC kích hoạt các công việc NAnt, để xây dựng MSBuild được sử dụng.

Một lưu ý cuối cùng: MSBuild KHÔNG hỗ trợ các dự án Thiết lập! Vì vậy, bạn bị mắc kẹt với việc gọi DevEnv.com hoặc sử dụng Visual Studio trực tiếp. Đó là những gì tôi đã làm, nhưng tôi đã vô hiệu hóa dự án thiết lập theo mặc định từ tất cả các cấu hình giải pháp, vì các nhà phát triển thường không cần phải xây dựng chúng và nếu có, họ có thể chọn thủ công để xây dựng chúng.



1

Các tài liệu và hướng dẫn có sẵn cho NAnt giúp dễ dàng bắt đầu học tập lệnh xây dựng với NAnt. Khi tôi hiểu rõ về NAnt và tạo các tập lệnh xây dựng, tôi bắt đầu dịch kiến ​​thức đó sang MSBuild (Tôi đã làm X trong NAnt, làm thế nào để tôi làm X trong MSBuild?). Tài liệu của Microsoft thường giả định một mức độ kiến ​​thức khá cao trước khi nó hữu ích.

Lý do để chuyển từ NAnt sang MSBuild là vì MSBuild hiện tại hơn. Thật không may, bản phát hành cuối cùng của NAnt là vào ngày 8 tháng 12 năm 2007, trong khi MSBuild 4.0 (.NET 4.0) không còn xa. Có vẻ như dự án NAnt đã chết.

Nếu bạn tìm thấy tài liệu tốt cho ai đó mới bắt đầu học cách tạo tập lệnh xây dựng bằng MSBuild, thì hãy bỏ qua NAnt và đi thẳng vào MSBuild. Nếu NAnt từng phát hành một bản phát hành mới thì tôi sẽ xem xét việc gắn bó với NAnt, nhưng hiện tại họ đang bị tụt lại phía sau.


1
Kể từ tháng 6 năm 2012, phiên bản 0.92 của NAnt có sẵn từ trang web: nant.sourceforge.net VÀ nó hỗ trợ .Net 4.0.
Brett Rigby

0

Chúng tôi sử dụng cả hai. NAnt chịu trách nhiệm cho tất cả các công cụ "tạo kịch bản", như sao chép, triển khai trên IIS , tạo các gói và MSBuild chịu trách nhiệm xây dựng giải pháp. Sau đó, chúng ta có thể tránh các vấn đề với .NET 4.0 không được hỗ trợ bởi một phiên bản mới của NAnt.

NAnt cũng có khả năng mở rộng hơn. Nếu chúng tôi muốn di chuyển các tập lệnh triển khai đến các máy chủ sản xuất, chúng tôi chỉ sao chép tệp xây dựng và cài đặt phiên bản .NET thích hợp - không có vấn đề về Visual Studio với các tệp csproj :)


0

YDeliver by Manoj là một khung xây dựng được xây dựng dựa trên PSake. Nó có một bộ chức năng thư viện phong phú, khả năng xác định quy trình công việc và chúng tôi đã sử dụng nó để phân phối hơn sáu dự án doanh nghiệp cho sản xuất.

Sử dụng kết hợp với TeamCity , CruiseControl hoặc bất cứ thứ gì có thể chạy PowerShell .


0

Chúng tôi sử dụng FlubuCore. Đây là thư viện C # mã nguồn mở để xây dựng các dự án và thực thi các tập lệnh triển khai bằng mã C #.

Ví dụ đơn giản về cách sử dụng flubu:

protected override void ConfigureTargets(ITaskContext session)
{           

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

Bạn có thể tìm thêm thông tin về flubu và cách bắt đầu ở đây: sự lựa chọn cho việc xây dựng công cụ-msbuild-nant-hoặc-một cái gì đó khác

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.