NAnt 与 MS Build
大家可能已经知道.net 2.0将会集成一个build tool:msbuild,当然,大家也知道,这明显的同.net社区中的nant功能重合。在此事上,我个人极度反感微软的做法。让我们来看看,如果java没有apache软件基金会的一些项目,java会像有这样的影响力? 微软真正的做法应该像sun将servlet和jsp引擎源代码捐赠给apache软件基金组织或是像ibm捐赠eclipse一样。让nant开发团队来做msbuild。毕竟,.net的发展很大程度上决定于.net社区的活跃层度。
关于msbuild的细节,我们可以从pdc 的session中了解 下载该ppt
随该ppt提供的sample带有一些文档,对msbuild进行了较为详细的介绍,这可能是当前惟一的msbuild的介绍资料了
无论是msbuild或是nant,都非常简单易用,msbuild除了build新格式的项目文件外,还能编译vs 2003的项目文件。从功能上来说nant现在要丰富一些,但msbuild将来绝不会逊色于nant,未来,估计nant只会在mono项目中拥有一席之地,我替nant感到难过:(
msbuild和nant均使用xml格式保存项目文件,从总体上语义类似,如根元素project,主要的tag: target等,但从文件格式上两者是不兼容的,下面说明以下主要的结构上的区别,方便大家同时掌握此两者。
元素命名
msbuild 使用Pascal命名法,nant使用纯小写
属性(property)
1、声明
nant:
<property name="propertyname" value="propertyvalue"/>
msbuild
<Property propertyname="propertyvalue"/>
2、使用
nant:
${propertyname}
msbuild
$(propertyname)
msbuild还有(PropertyGroup)属性组的概念
任务(task)
nant和msbuild的task模式不同,nant是每个任务一个标记,如
<csc output="hello.exe" target="exe">
....
</csc>
而msbuild则只有一个标记task,通过name属性来进行区别
<Task Name="CSC">
....
</Task>
同nant类似,msbuild允许你通过继承Task来创建自己的Task
FileSet vs Item
nant使用FileSet的概念,比方说,以下说明需要编译的文件,其中references,sources就是FileSet
<project name="testmsbuild" default="Build">
<target name="Build">
<csc target="exe" output="test.exe">
<references>
<includes name="bin\mydll.dll"/>
<include name="bin\mydll2.dll"/>
</references>
<sources>
<includes name="test.cs"/>
<includes name="person.cs"/>
</sources>
</csc>
</target>
</project>
msbuild使用Item的概念,用type属性来区别,允许多个同type的Item,如果使用@(typename)引用则成为ITaskItem Array,像Soruces,References 都接受ITaskItem Array(string array 是通过;分隔来实现的)
<Project DefaultTargets="Build">
<Item Type="CSFile" Include="msbuild.cs"/>
<Item Type="Reference" Include="Person.dll"/>
<Target Name="Build">
<Task Name="CSC" Sources="@(CSFile)" OutputAssembly="testmsbuild.exe" TargetType="exe" References="@(Reference)"/>
</Target>
</Project>
个人看法
就我自己而言,我还是喜欢nant,当然,主要是msbuild当前仅提供有限的功能。而nant,似乎已经到了无所不能的境界,大家用用便知。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?