概述
对于正在开发的项目,一般需要搭建测试/演示环境,将开发中的最新程序部署到测试环境上(Edge版本,一般指最新成果,但未经过严格测试),便于公司领导、客户、项目经理及时了解开发进展。
最简单的部署也大致需要获取源代码、编译、部署、运行几个环节,这几个环节伴随着较多的“手工操作”,容易出错,并且部署次数越多,累计花费的时间也越多。
因此在java领域,出现了很多项目构建(build)工具,而.net平台上的构建工具数量较少,除了微软自己的MSBuild外,最有影响力的是nant,NHibernate、log4net等多个开源项目都使用它来构建。
网络上介绍nant、svn的文档相当多,各位可以自行学习,本文的目的是介绍通过组合使用这些工具,用以完成“获取源代码”、“编译”、“部署”、“运行”几个环节的操作,将部署过程标准化,减少部署出错概率、节省时间。
个人认为mono是.net的未来,但我对linux还不熟悉,所以只讨论windows平台下nant的应用。
打造自己的工具包
想要达到“一键部署”的效果,需要制作工具包,将多个工具配合使用才可以,工具包的好处是我们可以根据项目情况对工具包进行剪裁和完善,删除不必要的文档和文件,以控制工具包尺寸,另外工具包要尽可能与环境无关,不应该要求运行环境安装svn、nant等等,我们应该包含这些基础组件,达到开箱即用的效果。因此需要大家自己动手了。我们的工具包中有三个工具,分别是svn客户端、nant和nantcontrib,另外还需要.net framework 2.0或以上版本。
1.建立工具包文件夹
首先在c盘根目录建立文件夹OneClickDeploy作为工具包的根文件夹,这个路径可以根据情况自行修改,构建脚本中指定即可。
2.svn客户端
svn客户端用于从svn服务器获取源代码,svn客户端的windows下二进制分发包有很多,建议使用
SlikSvn,下载安装后,我们需要将C:\Program Files\SlikSvn\bin下的所有文件复制到c:\OneClickDeploy\SlikSvn下,只需要复制bin文件夹即可,其他文件夹中是版权声明、帮助文件等内容,我们不使用他们。
3.nant程序
nant就是我们构建工具的核心了,它负责执行构建脚本,并提供了很多任务、函数,比如获取当前时间,操作文件等,详细文档参见
http://nant.sourceforge.net/release/latest/help/。
从
http://nant.sourceforge.net/nightly/latest/nant-bin.zip下载最新程序,目前发布的0.86 Beta 1版本存在bug,因此还是建议下载nightly程序。下载后,将压缩包中的bin文件夹下的所有文件复制到c:\OneClickDeploy\nant-0.86。
4.nantcontrib程序
nantcontrib是对nant任务的扩展,比如支持多种源代码版本库,对iis操作等,文档参见
http://nantcontrib.sourceforge.net/release/latest/help/。
从
http://nantcontrib.sourceforge.net/nightly/latest/nantcontrib-bin.zip下载最新程序,下载后,将压缩包中的bin文件夹下的所有文件复制到c:\OneClickDeploy\nantcontrib-0.86。
至此,我们的工具包准备完成,大家可以自行丰富工具包,比如添加7z,提供文件压缩打包功能,文件夹结构如下:
c:\OneClickDeploy
\nant-0.86
\NAnt.exe
\...
\nantcontrib-0.86
\NAnt.Contrib.Tasks.dll
\...
\SlikSvn
\svn.exe
\...
一般web站点的部署脚本
<?xml version="1.0" encoding="utf-8" ?>
<!-- 项目名称,只用于显示 -->
<project name="project_name" >
<!-- 使用NAnt.Contrib,指定Contrib的路径 -->
<loadtasks assembly="C:/OneClickDeploy/nantcontrib-0.86/NAnt.Contrib.Tasks.dll" />
<!-- 源代码环境配置 -->
<!-- 源代码输出路径,默认为输出到当前文件夹下的src文件夹 -->
<property name="source.outdir" value="src"/>
<!-- svn服务器地址 -->
<property name="source.svn.path" value="svn://server/trunk/web0"/>
<!-- svn用户名 -->
<property name="source.svn.username" value="user"/>
<!-- svn密码 -->
<property name="source.svn.password" value="pass"/>
<!--
***************************************************************************
更新代码:如果代码已签出,执行update命令,否则执行checkout命令,一般不需要修改
***************************************************************************
-->
<target name="source">
<if test="${directory::exists(source.outdir)}">
<echo message="更新代码${source.svn.path}"/>
<svn-update uri="${source.svn.path}" destination="${source.outdir}" username="${source.svn.username}" password="${source.svn.password}" verbose="false" />
</if>
<if test="${not directory::exists(source.outdir)}">
<echo message="签出代码${source.svn.path}"/>
<mkdir dir="${source.outdir}"/>
<svn-checkout uri="${source.svn.path}" destination="${source.outdir}" username="${source.svn.username}" password="${source.svn.password}" verbose="false" cache-auth="false" />
</if>
</target>
<!--
编译代码“函数”
compile.target:exe, winexe, library or module
compile.assembly: 程序集
compile.outdir: 输出路径
complie.debug: true/false
-->
<target name="compile">
<!-- 生成编译后的文件名 -->
<if test="${compile.target=='library'}">
<property name="compile.output" value="${compile.assembly}.dll"/>
</if>
<if test="${compile.target=='winexe'}">
<property name="compile.output" value="${compile.assembly}.exe"/>
</if>
<csc target="${compile.target}" output="${path::combine(compile.outdir, compile.output)}" debug="${compile.debug}" optimize="true" verbose="false">
<sources>
<!-- 编译所有cs文件 -->
<include name="${source.outdir}/${compile.assembly}/**/*.cs" />
</sources>
<references>
<!-- 编译引用的dll文件,我将依赖的dll放到了svn://server/trunk/web0/Assembly文件夹下,所以这里需要制定引用Assembly下的所有dll文件 -->
<include name="${source.outdir}/Assembly/**/*.dll" />
<!-- 引用编译结果文件夹下的所有dll文件,一般来说类库项目之间也存在应用关系,基础类库编译完成后将编译结果dll存放compile.outdir文件夹下,编译业务类库时需要引用基础类库,因此需要引用compile.outdir下的所有dll -->
<include name="${compile.outdir}/**/*.dll" />
<!-- 排除引用的dll文件 -->
<exclude name="${source.outdir}/Assembly/**/libmySQL.dll"/>
</references>
<resources>
<!-- 嵌入的资源,需要将nhibernate映射文件作为嵌入的资源,编译到程序集中 -->
<include name="${source.outdir}/${compile.assembly}/**/*.hbm.xml" />
</resources>
</csc>
</target>
<!--
***************************************************************************
构建web站点
***************************************************************************
compile.debug:
/debug [+/-] :当选用/debug +就会把创建.pdb文件,并把调试信息存储到里面;/debug -是一个缺省设置,就是不产生任何调试信息。
/debug:[full/pdbonly] :当使用/debug:full就是创建缺省的调试信息,有点类似/debug+选项。/debug: pdbonly选项是创建.pdb文件,并且你只能使用源代码调试在调试工具里。
compile.outdir:
编译结果输出文件夹
-->
<property name="compile.debug" value="PdbOnly"/>
<!-- 将类库的编译结果存放到web/bin文件夹下 -->
<property name="compile.outdir" value="${source.outdir}/web/Bin"/>
<!-- web站点的物理路径 -->
<property name="deploy.rundir" value="C:/web0"/>
<target name="compile-web" description="编译web站点">
<echo message="编译web站点"/>
<!-- 将Common和Business编译后放到源代码web/bin文件夹,需要根据web站点引用类库的依赖关系按顺序编译-->
<delete dir="${compile.outdir}" verbose="true" if="${directory::exists(compile.outdir)}" />
<mkdir dir="${compile.outdir}"/>
<property name="compile.assembly" value="Common"/>
<property name="compile.target" value="library"/>
<call target="compile" />
<property name="compile.assembly" value="Business"/>
<property name="compile.target" value="library"/>
<call target="compile" />
<!-- 源代码Assembly下的所有dll复制到web/bin文件夹-->
<copy todir="${compile.outdir}">
<fileset basedir="${source.outdir}/Assembly">
<include name="/**/*.dll" />
</fileset>
</copy>
<!--停止IIS-->
<exec program="iisreset">
<arg value="-stop" />
</exec>
<!--删除web站点物理文件夹-->
<delete dir="${deploy.rundir}" verbose="true" if="${directory::exists(deploy.rundir)}" />
<!--web预编译-->
<exec program="aspnet_compiler">
<arg value="-v" />
<arg value="/s" />
<arg value="-p" />
<arg value="${source.outdir}/web" />
<arg value="${deploy.rundir}" />
</exec>
<!--启动IIS-->
<exec program="iisreset">
<arg value="-start" />
</exec>
</target>
</project>
上面的构建文件比较复杂,实际上分为几个环节:获取源代码source、编译web站点compile-web,编译web站点内又包括编译类库和预编译web站点,大家需要根据项目的实际情况,对构建文件进行修改。
使用
将上面的构建文件保存在任意文件夹下,如c:\deploy\web.build,并在这个文件夹下创建批处理脚本deploy.bat
path=C:\OneClickDeploy\nant-0.86;C:\OneClickDeploy\SlikSvn;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
nant -t:net-3.5 -buildfile:web.build source compile-web
pause
运行deploy.bat,首先会设置nant、svn、.net2.0 framework的路径,然后使用构建脚本进行部署:
1.更新源代码,首次运行会签出源代码
2.编译类库,示例中为Common、Business
4.停止iis并删除web站点物理路径
3.预编译web站点并输出到web站点物理路径
4.启动iis
本文介绍了使用svn客户端、nant工具,完成“获取源代码”、“编译”、“部署”、“运行”几个环节的操作,抛砖引玉,希望大家灵活运用,提出更好的想法。
下篇文章《nant的典型应用——部署windows服务》
分享到:
相关推荐
使用NAnt进行每日构建 可自动从vstf下载和编译源码,并且自动部署站点
NAnt提供了XML语法,允许开发者通过编写构建脚本来执行各种任务,如编译代码、创建安装程序、运行测试、部署应用等。0.86 Beta 1是NAnt的一个版本,它支持.NET Framework 2.0和.NET Framework 3.5,这两个版本在当时...
**Nant 0.85** 是一个针对 .NET Framework 的构建工具,它与 Java 平台上的 Apache Ant 类似,旨在提供一种跨平台的方式来自动化软件构建过程。Nant(.NET ANother Toolint)是.NET社区的一个重要工具,尤其对于那些...
在实际应用中,NAnt 可用于持续集成环境,配合版本控制系统(如Git)、自动化测试框架(如NUnit)和部署工具,构建一套完整的.NET项目自动化流程。对于大型的.NET项目团队来说,NAnt 提供了一种标准的、跨平台的构建...
通过NAnt,开发者可以轻松地进行项目的编译、测试、部署等操作,极大地提高了开发效率。 #### 二、NAnt安装与配置 ##### 1. 下载NAnt 访问NAnt官网(http://nant.sourceforge.net/),下载最新版本的NAnt安装包。...
C#用于开发Windows桌面应用、Web应用、移动应用等多种类型的软件。 **MSBuild**:MSBuild是微软开发的构建引擎,用于构建.NET项目。它与Visual Studio紧密集成,支持通过XML格式的项目文件(.csproj)进行构建过程...
### 配置EditPlus与NAnt构建轻型的.NET开发环境 #### 一、引言 随着.NET技术的发展,开发者们对于开发环境的选择也日益多样化。对于轻量级的开发需求,尤其是仅需进行少量代码修改的情况下,使用复杂的集成开发环境...
不过,如果你指的是将DLL中的类型注册到protobuf,以便其他应用程序可以使用,那么可能需要创建一个protobuf的元数据文件(`.desc`),然后使用`protoc`的`--descriptor_set_out`选项生成元数据,供其他应用使用。...
nant 和 nantcontrib 是在 .NET 平台上用于自动化构建过程的工具,它们在软件开发过程中扮演着重要的角色。Nant 是一个基于 .NET 的构建工具,类似于 Java 世界的 Ant。它提供了命令行接口,允许开发者编写 XML 文件...
NAnt 在开发过程中扮演的角色非常重要,因为它能够自动化构建、测试、打包和部署过程,提高开发效率,确保一致性,并简化持续集成流程。通过使用 NAnt,开发者可以创建跨平台的构建脚本,因为它是基于 .NET,可以在...
NAnt,全称为“.NET Automated Network Toolkit”,是一款基于.NET Framework的开源自动化构建工具,它的设计灵感来源于...通过学习和应用NAnt,开发者可以更加专注于编写高质量的代码,而让NAnt处理构建和部署的琐事。
它提供了一种XML语法来定义构建脚本,这些脚本可以执行各种任务,如编译源代码、运行单元测试、打包和部署应用程序等。NAnt支持多种.NET语言,如C#、VB.NET和F#,并且可以通过插件扩展其功能。 ### 安装与配置NAnt ...
遗憾的是,NAnt 缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual Studio 2010 的新的生成平台)为每种健壮的生成方案进行了准备,...
遗憾的是,NAnt 缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual Studio 2005 的新的生成平台)为每种健壮的生成方案进行了准备,...
遗憾的是,NAnt 缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual Studio 2005 的新的生成平台)为每种健壮的生成方案进行了准备,...
遗憾的是,NAnt 缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual Studio 2008 的新的生成平台)为每种健壮的生成方案进行了准备,...
### 自动化集成CruiseControl.NET、NAnt与NUnit:构建持续集成环境 #### 概述 在软件开发过程中,回归测试是一个重要的但经常被忽视的环节。回归测试是指在对已有代码进行修改后重新运行之前的测试用例,以确保...
nant-0.92-binnant-0.92-binnant-0.92-binnant-0.92-binnant-0.92-binnant-0.92-binnant-0.92-binnant-0.92-binnant-0.92-binnant-0.92-binnant-0.92-bin
本篇文章将聚焦于如何结合Visual Studio和NAnt工具来构建Xamarin.Android应用程序。 首先,我们需要了解Xamarin。Xamarin是一个强大的开发平台,它提供了对.NET Framework的支持,允许开发人员利用共享代码库创建多...
《14.C#软件项目开发全程剖析——全面透视SharpDevelop软件的开发内幕》是一本深入探讨C#软件项目开发过程的专著,尤其侧重于开源IDE(集成开发环境)SharpDevelop的开发内幕。这本书旨在为读者揭示从项目规划、设计...