NAnt 还是 MSBuild,选择哪一个,什么时候?

我知道还有其他 南特MSBuild相关的问题,关于堆栈溢出,但我不能找到一个两者之间的直接比较,所以这里的问题。

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

32163 次浏览

就我个人而言,我使用两者-为同一个项目。

MSBuild 非常擅长于构建 VisualStudio 解决方案和项目——这就是它的用途。

在我看来,NAnt 更容易手工编辑——特别是如果您已经知道 Ant 的话。使用 NAntContrib,NAnt 可以非常容易地调用 MSBuild。因此,我手工制作了一个 NAnt 脚本来做诸如复制构建的文件、清理等事情,并调用 MSBuild 来完成实际的“将我的 C # 源代码转换为程序集”部分。

如果你想要一个例子,看看我的 协议缓冲建造档案。(我不会说这是一个出色的 NAnt 脚本,但它确实起到了作用。)

我最近从 NAnt 转到了 MSBuild,因为它能够构建 VS 解决方案。不过,我偶尔还是会用到 NAnt。

您可能还想查看类似于 NAntContrib 的 MSBuild 社区任务

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

我最近不得不在楠村建立一个 Silverlight 项目。我发现,如果我只用 MsBuild 做这件事,生活会变得更容易——我最终在 Nant 脚本中调用了一个 MsBuild 任务,所以我认为将两者混合并匹配并不是太不寻常。

除此之外,我认为这将是一个个人偏好的问题——显然,你可以在 Visual Studio 中管理 MsBuild 的部分/大部分功能,如果你喜欢的话。如果您喜欢手工编写脚本,Nant 似乎更加灵活,而且更加适合您,如果您来自 Java 世界,那么您可能对它非常熟悉。

MSBuild (在 Windows 平台上)对我的一个主要吸引力是它作为。NET 本身。这意味着任何具有 WindowsUpdate 的最新 Windows 计算机都可以使用 MSBuild。除此之外,C # 编译器也是。NET 本身,你就有了一个可以在干净的机器上构建项目的平台。不需要安装 VisualStudio 这个庞然大物。另一方面,在触发构建之前,必须显式安装 NAnt。

顺便说一句,我过去在非平凡的构建上使用过 NMake、 Make、 Ant、 Rake、 NAnt 和 MSBuild (按照这个顺序)。毫无疑问,我最喜欢的是 MSBuild (我不喜欢它,因为“那是 Visual Studio 使用的”)。恕我直言,这是一个非常低估的构建工具。

我将把 NAnt 与 MSBuild 比较为过程式编程和函数式编程之间的区别。NAnt 非常简单,你看到什么就能得到什么。另一方面,MSBuild 需要更多的思考。学习曲线更陡峭。但是,一旦你“得到它”,你可以做一些惊人的事情。

因此,如果你也喜欢函数式或逻辑风格的编程,我建议你看看 MSBuild ——如果你愿意在看到实际结果之前投入一点时间和精力(当然,我也坚信投资最终会有回报,你可以更有效地做更强大的事情)。

这周我做了一个类似的调查,以下是我能够确定的:

南特:

  • 跨平台(支持 Linux/Mono)。它可以方便地将网站安装到多个目标(例如,Linux Apache 和 WindowsIIS)。
  • 95% 的语法类似于 Ant (当前 Ant 用户或 Java 构建器很容易学会)
  • 与 NUnit 集成以作为构建的一部分运行单元测试,并与 NDoc 集成以产生文档。

MSBuild:

  • 内置到.NET。
  • 与 Visual Studio 集成
  • 在 Visual Studio 中很容易开始使用 MSBuild ——这些都是幕后工作。如果您想进一步深入,可以手动编辑文件。

主观差异: < em > (YMMV)

  • NAnt 文档稍微简单一些。例如,MSBuild 任务参考列出“ Csc Task-描述 Csc 任务及其参数”(谢谢你的“帮助”),相对于 NAnt 任务参考“ csc-CompilesC # 程序”我注意到 MSBuild 文档已经得到了改进,现在好多了(可能和 NAnt 不相上下)。
  • 不容易找出如何编辑构建脚本源代码(* 。* proj 文件)。使用 NAnt,我只需让 VisualStudio 处理。将脚本构建为 XML 文件。
  • 显然,在 VisualStudio 中,Web 应用程序项目没有 * 。* proj 文件默认情况下,所以我有很大的困难,搞清楚如何甚至让 MSBuild 运行在我的创建一个部署脚本。
  • NAnt 不是 VisualStudio 内置的,必须通过外接程序或作为“外部工具”添加。布置起来有点麻烦。
  • (编辑:)我的一个同事提出了这个问题——如果您想使用 巡航控制设置一个构建机器以进行持续集成,CruiseControl 可以很好地与 NAnt 进行开箱即用的集成。CruiseControl 也有一个 MSBuild 任务
  • 请参阅下面的评论,了解关于主观差异的最新完整讨论。

NAnt 有更多现成的特性,但是 MSBuild有一个更好的基本结构(项目元数据岩石) ,这使得构建可重用的 MSBuild 脚本更加容易。

MSBuild 需要一段时间来理解,但一旦你这样做,它是非常好的。

学习资料:

最后我两样都用了。在重新设计我们的构建系统时,我遇到了一个棘手的问题。换句话说,我无法摆脱。Vcproj (和 family) ,因为我们每个人都在使用 VS 来更新项目文件、设置和配置。因此,如果没有大量的复制和容易出错的过程,我们就不能将构建系统建立在一组新的文件上。

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

对于持续集成,我使用 CruiseControl。

最后一个注意事项: MSBuild 不支持安装项目!因此,您只能调用 DevEnv.com 或直接使用 VisualStudio。这就是我最后所做的,但是我从所有解决方案配置中默认禁用了安装项目,因为开发人员通常不需要构建它们,如果他们需要,他们可以手动选择来构建它们。

南特脚本调用 MSBuild 时,我同时使用了这两种方法。我留在 NAnt 的主要原因是 与世隔绝。让我解释一下为什么我觉得这很重要:

  1. 向项目添加依赖项。 NAnt 构建文件与 Visual Studio 格格不入(在我的例子中,我认为这是专业的) ,因此 Visual Studio 不会尝试使用它做任何事情。MSBuild 任务是嵌入式的,因此是解决方案的一部分,并且可以引用其他 MSBuild 任务。我从别人那里收到源代码,却发现我无法构建,因为没有安装 MSBuild 社区任务。我发现特别令人沮丧的是,VisualStudio 就是不能构建,并抛出了一堆错误,使我失去了调试的时间。尽管请求的构建可以继续进行(例如,作为调试构建) ,而不需要 MSBuild 任务的一些额外部分,但是仍然是这样。简而言之: 如果可以避免的话,我不喜欢在项目中添加依赖项

  2. 我不信任 VisualStudio,因为我不能让它的开发团队参与进来。这可以追溯到 VisualStudio 的早期,当时它会大量使用我的 HTML。例如,我仍然不使用设计师(在最近的一次会议上,我发现同事们也这样做)。我发现 Visual Studio 可能会搞砸 DLL 文件中的依赖关系和版本号(我无法复制这一点,但它确实在一个项目中持续发生,并造成了很多不幸和损失的时间)。我已经求助于仅使用 VisualStudio 在调试模式下生成的生成过程。对于生产,我使用 NAnt 来控制所有的 表面上。如果我使用 NAnt 构建,VisualStudio 就不能再进行干预了。

PS: 我是一个 Web 开发人员,不做 Windows 窗体开发。

可用于 NAnt 的文档和教程使得使用 NAnt 开始学习构建脚本变得更加容易。一旦我掌握了 NAnt 和创建构建脚本的窍门,我就开始将这些知识转化为 MSBuild (我在 NAnt 中做了 X,在 MSBuild 中如何做 X?).微软的文档在有用之前通常假设有相当高的知识水平。

从 NAnt 切换到 MSBuild 的原因是因为 MSBuild 更加流行。遗憾的是,NAnt 的最后一个版本发布于2007年12月8日,而 MSBuild 4.0(。NET 4.0)并不遥远。看起来 NAnt 项目已经死了。

如果您找到了适合刚开始学习使用 MSBuild 创建构建脚本的人的好文档,那么跳过 NAnt,直接进入 MSBuild。如果 NAnt 发布了一个新版本,我会考虑继续使用 NAnt,但是他们现在已经落后了。

我注意到一些海报提到的一件事是必须手动编辑.csproj (或.vbproj 等)文件。

MSBuild 允许自定义这些。* proj 文件通过使用。用户档案。如果我有一个名为 MyCreativelyNamedProject.csproj的项目,并希望自定义其中的 MSBuild 任务,我可以创建一个名为 用户名: MyCreativelyNamedProject.csproj.user的文件,并使用 CustomBefore MicrosoftCommonTargetsCustomAfterMicrosoftCommonTargets来自定义这些文件。

此外,NAnt 和 MSBuild 都可以通过自定义 MSBuild 任务和 NantContrib 扩展定制到核心内容。

因此,使用 NAnt 或 MSBuild 实际上归结为熟悉程度:

  • 如果您已经熟悉 Ant,那么使用 NAnt。学习曲线将非常简单。
  • 如果您不熟悉这两种工具,则 MSBuild 已经与 VisualStudio 集成,不需要其他工具。

还值得一提的是,MSBuild 几乎可以保证在 .NET和 Visual Studio 的所有新版本发布后立即使用,而 NAnt 可能会有一些延迟。

我们两个都用。NAnt 负责所有的“脚本”工作,比如复制、在 IIS上部署、创建包,MSBuild 负责构建解决方案。这样我们就可以避免不支持的问题。NET 4.0的新版本。

NAnt 也更具可伸缩性。如果要将部署脚本迁移到生产服务器,则只需复制构建文件并安装适当版本的。NET-没有使用 csproj 文件的 VisualStudio 问题:)

Manoj 的 YDeliver 是一个构建在 PSake 之上的构建框架。它具有丰富的库功能集,能够定义工作流,我们已经使用它将超过六个企业项目交付到生产环境中。

团队城市巡航控制或任何可以运行 PowerShell的东西一起使用它。

我们使用 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 和如何开始的信息: 选择-为-构建-工具-msbuild-ant-or-something-else