我知道还有其他 南特和 MSBuild相关的问题,关于堆栈溢出,但我不能找到一个两者之间的直接比较,所以这里的问题。
什么时候应该选择 NAnt 而不是 MSBuild?哪个更适合做什么?NAnt 是否更适合于家庭/开源项目和工作项目的 MSBuild?这两者中的任何一个有什么经验?
就我个人而言,我使用两者-为同一个项目。
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 ——如果你愿意在看到实际结果之前投入一点时间和精力(当然,我也坚信投资最终会有回报,你可以更有效地做更强大的事情)。
这周我做了一个类似的调查,以下是我能够确定的:
南特:
MSBuild:
主观差异: < em > (YMMV)
NAnt 有更多现成的特性,但是 MSBuild有一个更好的基本结构(项目元数据岩石) ,这使得构建可重用的 MSBuild 脚本更加容易。
MSBuild 需要一段时间来理解,但一旦你这样做,它是非常好的。
学习资料:
最后我两样都用了。在重新设计我们的构建系统时,我遇到了一个棘手的问题。换句话说,我无法摆脱。Vcproj (和 family) ,因为我们每个人都在使用 VS 来更新项目文件、设置和配置。因此,如果没有大量的复制和容易出错的过程,我们就不能将构建系统建立在一组新的文件上。
出于这个原因,我决定保留 VS 的“ proj”文件并使用 MSBuild (它们是 MSBuild 文件,至少 VS2005和 VS2008使用 MSBuild 项目文件)。对于其他所有事情(自定义配置、单元测试、打包、准备文档... ...) ,我使用了 NAnt。
对于持续集成,我使用 CruiseControl。
最后一个注意事项: MSBuild 不支持安装项目!因此,您只能调用 DevEnv.com 或直接使用 VisualStudio。这就是我最后所做的,但是我从所有解决方案配置中默认禁用了安装项目,因为开发人员通常不需要构建它们,如果他们需要,他们可以手动选择来构建它们。
使用 MSBuild。
为什么要添加一些其他的东西到混合当你有一些将做一个合理的工作开箱即用?当 MSBuild 到来时,NAnt 死了。而 单核细胞增多症将有一个 MSBuild 实现(Xbuild)。
问问你自己你想从构建系统中得到什么?我想要一个构建系统,也是我的 IDE使用,而不是维护两个不同的配置。
就个人而言,我希望听到一些关于 NAnt 的真实论据,因为我想不出任何真正站得住脚的论据。
在 南特脚本调用 MSBuild 时,我同时使用了这两种方法。我留在 NAnt 的主要原因是 与世隔绝。让我解释一下为什么我觉得这很重要:
向项目添加依赖项。 NAnt 构建文件与 Visual Studio 格格不入(在我的例子中,我认为这是专业的) ,因此 Visual Studio 不会尝试使用它做任何事情。MSBuild 任务是嵌入式的,因此是解决方案的一部分,并且可以引用其他 MSBuild 任务。我从别人那里收到源代码,却发现我无法构建,因为没有安装 MSBuild 社区任务。我发现特别令人沮丧的是,VisualStudio 就是不能构建,并抛出了一堆错误,使我失去了调试的时间。尽管请求的构建可以继续进行(例如,作为调试构建) ,而不需要 MSBuild 任务的一些额外部分,但是仍然是这样。简而言之: 如果可以避免的话,我不喜欢在项目中添加依赖项。
我不信任 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 MicrosoftCommonTargets和 CustomAfterMicrosoftCommonTargets来自定义这些文件。
此外,NAnt 和 MSBuild 都可以通过自定义 MSBuild 任务和 NantContrib 扩展定制到核心内容。
因此,使用 NAnt 或 MSBuild 实际上归结为熟悉程度:
还值得一提的是,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