NAnt NAnt 自动编译之废话谈 (含 build 脚本)

liuxue.gu@hotmail.com · 2008年08月19日 · 5 次阅读

NAnt 自动编译之废话谈

2008-08-04 来源:网络  

我越发觉得我有写中文 Blog 的需要了,尤其是技术文章。

此前我阐述了我为什么写英文 Blog 的原因,还是有很多朋友问我。然而我相信我会坚持的,毕竟无论从数量还是质量上来看,我并不是一个合格的 Blogger。很多原因导致了不合格,也许我总是脱离了 Blog 的初衷,不该老是在面对观众,另外关于思考的时间,我还是要每天坚持更多。关于英文的感受还是颇深:用中文四五句话可以说完的一篇文章,用英文可以拖拉一大串,久而久之,不仅弥补了生怕没有把网页撑的满满的歉疚,还能忽悠一下那些没有信心一口气读完满篇挫词滥语的观众们-喔,sorry,这不是我的本意,请不要怀疑我对你们的真诚。

在我的 intraVnews 的收藏夹里面,除了朋友同学的几个 Feeds 是中文外,其它的绝大多数都是英文的。不敢否认,我的大部分兴趣全部投入到了技术上面,关于技术,而且是那些更新不断的技术,勿庸置疑地让我孤注一掷在更多的国外的文章,专家,作者的拉丁字母之下。除此,工作的环境,剥夺了我一日中绝大部分时间使用中文的机会,于是乎把 Blog 迁就成英文也是水到渠成。

在过去的一年多时间里,我发现我的朋友圈虽然在渐渐变大,但是了解我的人,远比我要了解的人少之又少。在订阅朋友的 Blog 和坚持每日必读后,终于发现原来有很重要的一点是我脱离了群众路线,Blog 上很久没有报料隐私,有也不是中文,于是乎霎有心得,便有此篇和此刻的心情。

上周我忙了一件事,做自动编译的脚本。

客户安装程序+每日构建+自动编译这个工作已经拖了很久了。趁 Build 服务器和网络重整间隙,把工作完成,终于松了口气。现在总结一下,作为一个中小型企业软件每日构建与发布的一个案例,有用处处大家讨论一下,有问题的欢迎斗批。再罗嗦一下,其实这些都是 CM 工作的范畴,只是当时我误入安装程序开发太深,加上资源没有到位,所以这份苦差才落到我的头上。关于 Daily Build 和 *ant 这些东西,其实是很简单的,就像曾面试过我的一个 MVP 反问我所言:“何不用批处理了事?”

目标:编写自动化脚本,自动完成从仓库提取源文件,编译,拷贝,打包,发布,邮件提醒等工作。

技术工具:NAnt, NAntContrib 等。

场景:Windows 2003 VMware Image, .Net SDK 2.0, Surround SCM 等。

由于涉及一些商业上的不得已,详细的需求就免了,虽然我这个人喜欢做事之前,把条条框框做的有模有样的。

在我最初的 Nant 脚本中完成的都是拷贝移动目录之类的活,是没有获取源代码这块的。熟悉 Ant 或 Nant 的应该清楚,Nant 本身只提供了从 VSS 或者 CVS 仓库访问源代码的接口。而我们用的是 Surround SCM,虽然也是多届 Jolt 大奖的得主,但我坚决肯定对 Nant 是不会提供直接访问支持。终于在 Seapine 网站 Surround SCM 的资源里面查到有 Ant 的支持,但是没有 Nant。没有关系,既然 Nant 从 Ant 得自真传,Java 与 C# 也成不了问题。提供 Ant 的接口虽然是免费,但是 Surround SCM 的商业软件,他们也不会笨的把接口开源,于是从朋友那里要了号称很牛的 Java 反编译工具 JShrink,开始读 Class 反编译后的 Java 代码。

Outlook 不自觉地来了个提醒,原来我只安排一天工作时间解决脚本和发布,如果继续,虽然我只要依葫芦画瓢,加上测试至少得一天时间,而且可靠性还得打折,毕竟不是一个主,还不是一个太监服侍的。

随手 Google 了一把 nant + SCM,天上居然还真掉下个馅饼,有个 NAntContrib 项目,早就帮我完成了对 SCM 访问的 Task。这个教训告诉我们,做任何自认为有创意的挑战性任务前,别忘记 Google 一下是否有前车之鉴。

拿到源代码就是开始编译了。我下载的 NAnt 是 0.85 的 Stable 版本。在我修改脚本想使用.net 2.0 进行源代码编译时候,居然告诉我不支持当前.net 的 SDK 版本。真是 Faint 了,还以为 NAnt 对.Net SDK 和 Runtime 的 Configuration 有多强,一上来就吃了一个闭门羹。吸取前一次教训,Google 一把,果真还有人告诉我怎么把 NAnt.exe.config 中配置成 2.0 版本的。这里发现这个版本发布时候,提供支持的最高.net framework 版本是 2.0Beta,于是我把它改成 Release 的版本,重新编译,结果在用调用 NGen 编译资源文件时候又报了一个错。难道这个 NAnt 不支持.net 2.0 Release 版本?如果是这样,我就疯掉了。打开 NAnt 的首页,几行红字清楚告诉有个最新的 Night Build 版本已经支持.net 2.0 release 版本,Cool!这个教训告诉我们,Google 得到的也不一定是最好的答案,遇到问题你碰壁的时候,不妨再回到问题的本身重头再找一下线索。

拿到最新版本重新编译,果然没有问题。现在取源代码,编译,拷贝都完成了,怎么发布到下载服务器呢?拷贝到远程服务器,第一个让我想到的是 SCP,我曾经在 Linux 环境下做过一段时间的开发,对这个 SSH 下的命令工具特有感情,所以第一时间想到了它。虽然在 NAntContrib 包里也找到了相关的 Task,但是最后多次测试之后还是放弃了。我们的发布服务器提供了 FTP 访问,难道 NAnt 没有提供这个最基本的 Task,奇怪。再次 Google,终于找到一个 FTPTask!再次证明了信息社会,获取资源信息的速度远比你本身掌握的信息量更加实用。

到这里一个自动的 NAnt 脚本终于可以拿出来 Show 一把了,

http://www.uml.org.cn/jchgj/200808043.asp

暂无回复。
需要 登录 后方可回复。