NAnt或MSBuild,哪一个可以选择?

Yor*_*lov 159 .net msbuild nant automation

我知道Stack Overflow上还有其他与NAntMSBuild相关的问题,但是我找不到两者之间的直接比较,所以这就是问题所在.

什么时候应该选择NAnt而不是MSBuild?哪个更适合什么?NAnt更适合家庭/开源项目和MSBuild工作项目吗?这两个中的任何一个有什么经验?

Ogr*_*m33 96

我本周做了类似的调查.这是我能够确定的:

楠:

  • 跨平台(支持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中,Web应用程序项目默认情况下不会获得*.*proj文件,因此我很难弄清楚如何让我的MSBuild运行以创建部署脚本.
  • NAnt不是Visual Studio内置的,必须使用加载项或"外部工具"添加.设置这有点痛苦.
  • (编辑:)我的一位同事提出了这个问题 - 如果你想使用CruiseControl建立一台用于持续集成的构建机器,CruiseControl可以很好地与NAnt集成.更新: CruiseControl还有一个MSBuild任务.
  • 请参阅以下评论,了解主观差异的完整和最新讨论.

  • @Yordan:或者只是将您的自定义放入一个单独的.build文件(或其他),然后从.csproj文件导入+执行.然后,您只需编辑一次.csproj,并可以将.build文件添加到您的解决方案中.双击,您就像任何其他文件一样进行编辑.可以在您的选项中将.build文件映射到XML编辑器. (18认同)
  • 存在MSBuild CCNet任务 - 详细信息可在以下网址找到:http://confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task (9认同)
  • @CleverHuman,是不是.user文件通常包含项目的用户特定模块,您通常不会与项目的其余部分一起检查?多年来我一直使用肯特的建议而且效果非常好.您修改PROJ文件一次以包含第二个PROJ文件,然后将第二个PROJ文件添加到您的项目中.从那时起,您可以轻松自定义第二个PROJ文件,而无需执行卸载/重新加载过程.出于这个原因,我倾向于倾向于MSBuild. (3认同)
  • 值得注意的是,您不需要自己修改.csproj文件.您可以使用MyProject.csproj.user文件进行这些修改,使.csproj文件保持干净和原始状态.MSBuild知道要查找那些.user文件,并将它们自动导入构建过程.请参阅:http://ahmed0192.blogspot.com/2006/11/customize-msbuild-without-modifying.html (2认同)
  • Mono现在支持MSbuild (2认同)

Mil*_*ian 77

对我来说,MSBuild的主要吸引力之一(在Windows平台上)是它本身就是.NET的一部分.这意味着任何与Windows Update一起更新的Windows计算机都将具有MSBuild.除此之外,C#编译器也是.NET本身的一部分,你有一个可以在干净的机器上构建项目的平台.无需安装Visual Studio庞然大物.另一方面,必须在触发构建之前显式安装NAnt.

仅仅为了记录,我在过去的非平凡构建中使用了NMake,Make,Ant,Rake,NAnt和MSBuild(按此顺序).我最喜欢的是MSBuild,请放手(我不喜欢它,因为"这就是Visual Studio使用的").恕我直言,这是一个非常不受重视的构建工具.

我会比较NAnt和MSBuild对程序和函数编程之间的区别.NAnt非常简单,你可以看到你所看到的.另一方面,MSBuild需要更多的思考.学习曲线更陡峭.但是一旦你"得到它",你就可以用它做一些惊人的事情.

所以我建议你看看MSBuild,如果你也倾向于功能或逻辑风格的编程 - 如果你愿意在看到实际结果之前投入一点时间和精力(当然,我也坚信投资最终会得到回报而你可以更有效地做更强大的事情).

  • 哇!不知道MSBuild附带了运行时.这很酷,我肯定能看到那里的好处.但是,我不理解功能/程序之间的比较.听到是什么让MSBuild在获得它之后变得如此强大,这将会很有趣. (11认同)
  • 应该添加一件事:不仅可以从msbuild中调用.NET程序集,而且可以访问大量非常方便的函数(例如,Systme.IO.Path中的所有内容都可以在构建脚本中派上用场) ,也可以在msbuild文件中编写普通的C#代码并执行它.这简直是​​令人敬畏的.http://msdn.microsoft.com/en-us/library/dd722601.aspx如果事情变得太复杂,编写自定义任务也是轻而易举的事. (6认同)
  • Msbuild实际上对来自各种sdks的文件有许多依赖关系,这些文件只在调用某些目标时才会变得明显.因此虽然msbuild开箱即用,但它可能无法运行. (2认同)

Jon*_*eet 45

就个人而言,我同时使用两个 - 用于同一个项目.

MSBuild非常擅长构建Visual Studio解决方案和项目 - 这就是它的用途.

在我看来,NAnt更容易手工编辑 - 特别是如果你已经知道Ant了.NAnt可以使用NAntContrib轻松调用MSBuild.因此,我手工制作一个NAnt脚本来执行复制构建文件,清理等操作 - 并调用MSBuild来实际执行"将我的C#源代码转换为程序集"部分.

如果您想要一个示例,请查看我的Protocol Buffers构建文件.(我不会声称它是一个神话般的NAnt脚本,但它完成了这项工作.)

  • 而且它确实支持 Mono。Mono 的 MSBuild 支持很糟糕。 (2认同)

Kon*_*kus 20

NAnt具有更多开箱即用的功能,但MSBuild具有更好的基本结构(项目元数据),这使得构建可重用的MSBuild脚本变得更加容易.

MSBuild需要一段时间来理解,但是一旦你做到这一点非常好.

学习资料:

  • 嘿,我听说过这些书:) (38认同)

Squ*_*rel 19

KISS =使用MSBuild.

为什么在你有一些能够开箱即用的合理工作的东西中添加其他东西?当MSBuild到达时,NAnt死了.而将有一个MSBuild实现,(xbuild).

DRY =使用MSBuild.

问问自己,你想从构建系统中得到什么?我想要一个我的IDE也使用的构建系统,而不是维护两种不同的配置.

就个人而言,我很想听听NAnt的一些真实论点,因为我无法想到任何真正存在水的东西.

  • "当msbuild到来时,nant就死了" - 我认为这就是硬道理,即使没有VS(我不使用). (2认同)

Cle*_*man 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可能会有一些滞后.

  • 根据这里的很多帖子,那些.USER文件包含+用户特定信息+不应该被签入,所以这是我想要建立自定义的最后一个地方...根据定义,任何构建自定义都不应该不是用户特定的,所以不应该进入那些.user文件...... (9认同)

小智 10

我使用两者都是因为我的NAnt脚本调用了MSBuild.我和NAnt待在一起的主要原因是隔离.让我解释为什么我觉得这很重要:

  1. 向项目添加依赖项.NAnt构建文件与Visual Studio不同(在我的情况下,我认为这是专业人员)因此Visual Studio不会尝试对它做任何事情.MSBuild任务是嵌入式解决方案的一部分,可以引用其他MSBuild任务.我收到了其他人的源代码,但发现我无法构建,因为没有安装MSBuild社区任务.我觉得特别令人沮丧的是,Visual Studio不会构建并抛出一堆错误,这些错误使我无法进行调试.尽管事实上所请求的构建可以继续(例如作为调试构建)而没有MSBuild任务的一些额外内容.简而言之:如果我可以避免,我不喜欢在我的项目中添加依赖项.

  2. 我不相信Visual Studio,因为我可以抛弃它的开发团队.这可以追溯到Visual Studio的早期阶段,当时它会屠杀我的HTML.我仍然没有使用设计师(最近在一次会议上我发现同事也这样做了).我发现Visual Studio可以搞砸DLL文件中的依赖项和版本号(我不能复制它,但它确实在一个项目中发生并且引起了很多的悲伤并且浪费了时间).我已经使用了一个构建过程,该过程使用Visual Studio仅在调试模式下构建.为了制作,我使用NAnt以便我在外部控制所有内容.如果我使用NAnt构建,Visual Studio就不能再干涉了.

PS:我是一名Web开发人员,不做Windows Forms开发.


mma*_*lay 6

虽然我对MsBuild不太熟悉,但我的印象是双方的一些关键差异可以通过增加补充:

我最近不得不在Nant建立一个Silverlight项目.我发现如果我只是使用MsBuild来生活会更容易 - 我最终在Nant脚本中调用了一个MsBuild任务,所以我认为混合和匹配两者并不是太常见.

除此之外,我想这将是一个个人偏好的问题 - 显然你可以在Visual Studio中管理MsBuild的一些/大部分功能,如果这是你的事情.如果您喜欢手工编写脚本,Nant似乎更灵活,更适合,如果您来自Java世界,那么您可能会在家中使用它.