NAnt或MSBuild,何时选择哪个?


160

我知道关于堆栈溢出还有其他与NAntMSBuild有关的问题,但是我找不到两者之间的直接比较,所以这里是问题。

什么时候应该选择NAnt而不是MSBuild?哪个更适合?NAnt是否更适用于家庭/开源项目以及适用于工作项目的MSBuild?两者的经验是什么?

Answers:


97

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

NAnt:

  • 跨平台(支持Linux / Mono)。例如,将网站安装到多个目标(即Linux Apache和Windows IIS)可能很方便。
  • 95%的语法与Ant相似(便于当前的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任务
  • 有关主观差异的完整和最新讨论,请参见下面的评论。

您可以编辑.proj文件,但是在卸载项目后(该项目的上下文菜单中应该有“卸载”选项)
Yordan Pavlov

18
@Yordan:或者只是将您的自定义内容放入一个单独的.build文件(或其他文件),然后从.csproj文件中导入并执行该自定义文件。然后,您只需要编辑一次.csproj,就可以将.build文件添加到解决方案中。双击,您就像在编辑其他文件一样。您可以选择将.build文件映射到XML编辑器。
肯特·布加亚特

9
存在一个MSBuild CCNet任务-有关详细信息,请访问:confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task
Gavin Miller 2009年

2
值得注意的是,您不需要自己修改.csproj文件。您可以使用MyProject.csproj.user文件进行那些修改,而使.csproj文件干净整洁。MSBuild会查找这些.user文件,并将其自动导入到生成过程中。参见:ahmed0192.blogspot.com/2006/11/…–
CleverPatrick

3
@ CleverHuman,.user文件通常不包含您通常不会随项目的其余部分一起签入的用户特定的mod吗?我使用肯特的建议已经很多年了,效果很好。您将PROJ文件修改一次以包含第二个PROJ文件,然后将第二个PROJ文件添加到您的项目中。从那时起,您可以轻松地自定义第二个PROJ文件,而不必执行该卸载/重新加载过程。出于这个原因,我倾向于倾向于MSBuild。
DarinH 2011年

77

对我而言(在Windows平台上)MSBuild的主要吸引力之一是它是.NET本身的一部分。这意味着,任何具有Windows Update的最新Windows机器都将具有MSBuild。除此之外,C#编译器也是.NET本身的一部分,并且您拥有一个可以在干净机器上构建项目的平台。无需安装Visual Studio庞然大物。另一方面,必须先明确安装NAnt,然后才能触发构建。

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

我可以将NAnt与MSBuild进行比较,以了解程序和函数编程之间的区别。NAnt非常简单,您可以看到。另一方面,MSBuild需要更多的思考。学习曲线更陡峭。但是,一旦“获得”,就可以用它做一些令人惊奇的事情。

因此,如果您还偏向于函数式或逻辑式编程,那么我建议您看一下MSBuild-如果您愿意花一些时间和精力在看到切实的结果之前(当然,我也坚信投资最终会有所回报,并且您可以更有效地执行更强大的任务)。


11
哇!不知道运行时附带了MSBuild。那很酷,我绝对可以在其中看到好处。但是,我不理解功能/过程之间的比较。听到一旦“获得” MSBuild如此强大的功能,这将很有趣。
Scott Saad 2009年

2
实际上,Msbuild对来自各种sdk的文件有很多依赖关系,这些依赖关系仅在调用某些目标时才变得明显。因此,尽管msbuild可用,但它可能无法运行。
山姆·希勒斯

6
应该增加一件事:不仅可以从msbuild内调用.NET程序集,从而可以访问很多非常方便的功能(例如,Systme.IO.Path中的所有内容都可以在构建脚本中使用) ,也可以在msbuild文件中编写纯C#代码并执行它。简直太棒了。msdn.microsoft.com/zh-cn/library/dd722601.aspx如果事情变得太复杂,编写自定义任务也很容易。
stijn 2012年

1
来自Wikipedia:“ MSBuild以前与.NET Framework捆绑在一起;但是从Visual Studio 2013开始,它却与Visual Studio捆绑在一起。”
DavidRR

也可以在此处独立于Visual Studio 2013下载MSBuild(Microsoft Build Tools 2013)。
DavidRR 2015年

45

就个人而言,我将两者都用于同一项目。

MSBuild非常适合构建Visual Studio解决方案和项目-这就是它的用途。

我认为,NAnt更容易手动编辑-特别是如果您已经了解Ant。NAnt可以使用NAntContrib轻松调用MSBuild。因此,我手工制作了一个NAnt脚本来执行诸如复制生成的文件,清理等工作,然后调用MSBuild进行实际的“将C#源代码转换为程序集”部分。

如果您想要一个示例,请查看我的协议缓冲区构建文件。(我不会说这是一个很棒的NAnt脚本,但确实可以完成。)


1
它确实支持Mono。Mono对MSBuild的支持很糟糕。
Mehrdad Afshari

@Mehrdad:是的,在某些时候我真得想办法去Protocol Buffers的编制上单...当前有一个错误系膜细胞停止其从工作:(当时的想法是一直认为它最终将在Mono工作虽然。
乔恩双向飞碟

1
伙计们,mono使用XBuild,很容易将MSBuild移植到XBuild。检查一下:mono-project.com/Porting_MSBuild_Projects_To_XBuild
fyasar

20

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

MSBuild需要花一些时间来理解,但是一旦完成,它就会非常好。

学习资料:


38
嘿,我听说过这些书:)
易卜拉欣·哈希米

19

=使用MSBuild。

当您开箱即用时可以做一些合理的工作,为什么还要添加其他内容呢?MSBuild到达时,NAnt死亡。而将有一个MSBuild实现,(xbuild)。

DRY =使用MSBuild。

问问自己,您要从构建系统中获得什么?我想要一个IDE也可以使用的构建系统,而不是维护两个不同的配置。

就我个人而言,我很想听听有关NAnt的一些真实论点,因为我只是想不出任何真正可以解决的问题。


2
“当msbuild出现时,nant死了”-即使没有VS(我不使用它),我也认为这是关键。
哈波

我同意。DotNet 1.1没有msbuild.exe。所以我们当时就被搞砸了。从2.0开始,msbuild.exe和其他库会大量运行。编写自定义MsBuild-Task具有学习曲线,但是这些年来我已经写了大约10篇。
granadaCoder 2014年

1
我必须同意,您应该使用与开发人员相同的工具进行构建,因为构建服务器将使用该工具使您更快地失败。
krystan荣誉

14

我注意到几位张贴者提到的一件事是必须手动编辑.csproj(或.vbproj等)文件。

MSBuild允许通过使用.user文件来自定义这些。* proj文件。如果我有一个名为MyCreativelyNamedProject.csproj的项目,并且想在其中自定义MSBuild任务,则可以创建一个名为MyCreativelyNamedProject.csproj.user的文件,并使用CustomBeforeMicrosoftCommonTargetsCustomAfterMicrosoftCommonTargets来自定义这些文件。

而且,可以通过自定义MSBuild任务和NantContrib扩展来针对心脏的内容自定义NAnt和MSBuild。

因此,使用NAnt或MSBuild确实可以使您熟悉:

  • 如果您已经熟悉Ant,请使用NAnt。学习曲线将非常容易。
  • 如果您不熟悉这两种工具,则MSBuild已经与Visual Studio集成在一起,不需要任何其他工具。

还值得补充的是,MSBuild几乎可以保证在所有新版本的.NET和Visual Studio发行后就可以使用,而NAnt可能会有一些滞后。


1
+1指出.net版本和nant版本之间的延迟。我记得当.net 3.5出现时,必须从'nets上使用被入侵的nant.exe.config才能使工作正常。不好玩。
mmacaulay 2010年

9
根据此处的大量帖子,那些.USER文件包含+特定于用户的信息+不应检入,因此这将是我要放置构建定制的最后一个位置...根据定义,任何构建定制均不应不是特定于用户的,因此不应进入这些.user文件中……
DarinH 2011年

1
同意冒险;.user-files就像建议用户的名字一样,甚至不应该签入您的源代码控制存储库。这不是使构建自动化的地方。
Kjetil Klaussen 2011年

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开发。


6

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

我最近不得不在南特建立一个Silverlight项目。我发现,如果只是使用MsBuild进行操作,生活会更轻松-我最终从Nant脚本中调用了MsBuild任务,因此我想将两者混合并匹配并不太常见。

除此之外,我想这将是个人喜好问题-显然,您可以在Visual Studio中管理MsBuild的某些/大部分功能。如果您更喜欢手工编写脚本,那么Nant似乎更灵活并且更适合,并且如果您来自Java世界,那么您很可能会熟悉它。


好点子。两种解决方案都可以通过任何所需的方式轻松扩展和定制。
CleverPatrick 2010年

2

我最终都使用了。重新设计构建系统时,我遇到了一个棘手的问题。也就是说,我无法摆脱.vcproj(及其家族),因为我们每个人都在使用VS更新项目文件,设置和配置。因此,如果没有庞大的重复和容易出错的过程,我们就无法基于新的文件集构建系统。

因此,我决定保留VS的“ proj”文件并使用MSBuild(它们是MSBuild文件,至少VS2005和VS2008使用MSBuild项目文件)。对于其他所有内容(自定义配置,单元测试,包装,准备文档...),我使用了NAnt。

为了进行持续集成,我使用了CruiseControl。因此,我们拥有触发NAnt作业的CC脚本,这些脚本用于构建使用过的MSBuild。

最后一点: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。
布雷特·里格比

0

我们都使用。NAnt负责所有“脚本”工作,例如复制,在IIS上部署,创建程序包,而MSBuild负责构建解决方案。然后,可以通过新版本的NAnt避免不支持的.NET 4.0的问题。

NAnt也更具可扩展性。如果要将部署脚本迁移到生产服务器,则仅复制构建文件并安装.NET的正确版本-csproj文件不会出现Visual Studio问题:)


0

Manoj的YDeliver是建立在PSake之上的构建框架。它具有丰富的库功能,定义工作流的能力,并且我们已使用它将六个以上的企业项目交付生产。

TeamCityCruiseControl或任何可以运行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-or-something-else

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.