`
lnj
  • 浏览: 54399 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

nant的典型应用——部署windows服务

阅读更多
请首先浏览本文上一篇文章《nant的典型应用——部署web站点》

windows服务与web站点的区别在于nant构建脚本略有不同,大体上还是分为获取源代码、编译类库、编译windows服务几个步骤,不同的是安装/反安装服务步骤。示例构建脚本如下:
<?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/win_service0"/>
    <!-- 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>

    <!--
    ***************************************************************************
    构建服务
    ***************************************************************************
    compile.debug:
    /debug [+/-] :当选用/debug +就会把创建.pdb文件,并把调试信息存储到里面;/debug -是一个缺省设置,就是不产生任何调试信息。
    /debug:[full/pdbonly] :当使用/debug:full就是创建缺省的调试信息,有点类似/debug+选项。/debug: pdbonly选项是创建.pdb文件,并且你只能使用源代码调试在调试工具里。
    compile.outdir:
    编译结果输出文件夹
    -->
    <property name="compile.debug" value="PdbOnly"/>
    <property name="compile.outdir" value="bin/sms"/>
    <target name="compile-sms" description="编译服务">
        <echo message="编译服务"/>
        <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" />

        <property name="compile.assembly" value="Sms"/>
        <property name="compile.target" value="winexe"/>
        <call target="compile" />       
    </target>

    <!--
    ***************************************************************************
    部署服务
    ***************************************************************************
    -->
    <!-- 服务名称 -->
    <property name="service.name" value="WinServic"/>
    <!-- 服务运行路径 -->
    <property name="deploy.rundir" value="C:/WinServic"/>
    <target name="deploy-service" description="部署服务">
        <echo message="部署服务"/>

        <property name="service.path" value="${deploy.rundir}/${service.name}.exe"/>
        <!-- 卸载原服务 -->
        <if test="${file::exists(service.path)}">
            <exec program="installutil">
                <arg value="${service.path}" />
                <arg value="/u" />
                <arg value="/LogFile" />
            </exec>
        </if>
        <!-- 将编译结果复制到运行目录 -->
	<delete dir="${deploy.rundir}" if="${directory::exists(deploy.rundir)}" />
        <copy todir="${deploy.rundir}">
            <fileset basedir="${compile.outdir}">
                <include name="/**/*.*"/>
            </fileset>
        </copy>
        <!-- 复制配置文件 -->
        <copy todir="${deploy.rundir}">
            <fileset basedir="${source.outdir}/Sms">
                <include name="_config/**/*.*"/>
            </fileset>
        </copy>
        <!-- 复制依赖类库 -->
        <copy todir="${deploy.rundir}">
            <fileset basedir="${source.outdir}/Assembly">
                <include name="Antlr3.Runtime.dll" />
                <include name="Iesi.Collections.dll" />
                <include name="NHibernate.ByteCode.LinFu.dll" />
                <include name="NHibernate.dll" />
                <include name="LinFu.DynamicProxy.dll" />

                <include name="ImApiDotNet.dll" />
                <include name="libmySQL.dll" />

                <include name="log4net.dll" />
                <include name="Newtonsoft.Json.dll" />
            </fileset>
        </copy>
        <!--安装服务-->
        <exec program="installutil">
            <arg value="${service.path}" />
            <arg value="/LogFile" />
        </exec>
    </target>

    <!--
    ***************************************************************************
    启动服务
    ***************************************************************************
    -->
    <target name="run-service" description="启动服务">
        <echo message="启动服务"/>
        <!-- 启动服务 -->
        <servicecontroller action="Start" service="${service.name}" verbose="true" />
    </target>
</project>


使用
将上面的构建文件保存在任意文件夹下,如c:\deploy\service.build,并在这个文件夹下创建批处理脚本deploy-service.bat
path=C:\OneClickDeploy\nant-0.86;C:\OneClickDeploy\SlikSvn;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
nant -t:net-3.5 -buildfile:service.build source compile-service deploy-service run-service
pause

运行deploy-service.bat,首先会设置nant、svn、.net2.0 framework的路径,然后使用构建脚本进行部署:
1.更新源代码,首次运行会签出源代码
2.编译类库,示例中为Common、Business
3.编译服务代码
4.卸载原服务
5.将编译结果及依赖类库复制到运行目录
6.安装新服务
7.启动服务
分享到:
评论

相关推荐

    NAnt 0.86 Beta 1

    NAnt提供了XML语法,允许开发者通过编写构建脚本来执行各种任务,如编译代码、创建安装程序、运行测试、部署应用等。0.86 Beta 1是NAnt的一个版本,它支持.NET Framework 2.0和.NET Framework 3.5,这两个版本在当时...

    使用NAnt构建和部署.Net解决方案 的一个项目示例

    使用NAnt进行每日构建 可自动从vstf下载和编译源码,并且自动部署站点

    Nant 0.85

    **Nant 0.85** 是一个针对 .NET Framework 的构建工具,它与 Java 平台上的 Apache Ant 类似,旨在提供一种跨平台的方式来自动化软件构建过程。Nant(.NET ANother Toolint)是.NET社区的一个重要工具,尤其对于那些...

    nant-0.91-alpha2-bin

    在实际应用中,NAnt 可用于持续集成环境,配合版本控制系统(如Git)、自动化测试框架(如NUnit)和部署工具,构建一套完整的.NET项目自动化流程。对于大型的.NET项目团队来说,NAnt 提供了一种标准的、跨平台的构建...

    NAnt配置与示例

    通过NAnt,开发者可以轻松地进行项目的编译、测试、部署等操作,极大地提高了开发效率。 #### 二、NAnt安装与配置 ##### 1. 下载NAnt 访问NAnt官网(http://nant.sourceforge.net/),下载最新版本的NAnt安装包。...

    学习NAnt小Demo_Build CS+Solution+MSBuild+SVN+NUnit+NUnitReport

    C#用于开发Windows桌面应用、Web应用、移动应用等多种类型的软件。 **MSBuild**:MSBuild是微软开发的构建引擎,用于构建.NET项目。它与Visual Studio紧密集成,支持通过XML格式的项目文件(.csproj)进行构建过程...

    Windows服务维护程序 (SRVINSTW.EXE)

    此外,还有一些第三方工具,如NAnt、InstallUtil和InnoSetup,也可以用于创建和安装Windows服务。 总之,SRVINSTW.EXE是Windows环境中管理和安装服务的重要工具,对于开发者和系统管理员来说,理解和掌握其使用方法...

    配置EditPlus与NAnt构建轻型的.NET开发环境

    ### 配置EditPlus与NAnt构建轻型的.NET开发环境 #### 一、引言 随着.NET技术的发展,开发者们对于开发环境的选择也日益多样化。对于轻量级的开发需求,尤其是仅需进行少量代码修改的情况下,使用复杂的集成开发环境...

    nant nantcontrib-0.85-src

    1. **跨平台**:由于基于 .NET,Nant 可以在 Windows、Linux 和 macOS 等多种操作系统上运行。 2. **自动化**:通过编写 XML 构建脚本,可以自动化编译、测试、打包、部署等一系列构建过程,提高开发效率。 3. **可...

    NAnt编译proto成C#和dll过程总结

    不过,如果你指的是将DLL中的类型注册到protobuf,以便其他应用程序可以使用,那么可能需要创建一个protobuf的元数据文件(`.desc`),然后使用`protoc`的`--descriptor_set_out`选项生成元数据,供其他应用使用。...

    nant-0.91-alpha1-bin.zip

    NAnt 在开发过程中扮演的角色非常重要,因为它能够自动化构建、测试、打包和部署过程,提高开发效率,确保一致性,并简化持续集成流程。通过使用 NAnt,开发者可以创建跨平台的构建脚本,因为它是基于 .NET,可以在...

    在.NET环境中实现每日构建--NAnt篇

    它提供了一种XML语法来定义构建脚本,这些脚本可以执行各种任务,如编译源代码、运行单元测试、打包和部署应用程序等。NAnt支持多种.NET语言,如C#、VB.NET和F#,并且可以通过插件扩展其功能。 ### 安装与配置NAnt ...

    NAnt - A .NET Build Tool-开源

    NAnt,全称为“.NET Automated Network Toolkit”,是一款基于.NET Framework的开源自动化构建工具,它的设计灵感来源于...通过学习和应用NAnt,开发者可以更加专注于编写高质量的代码,而让NAnt处理构建和部署的琐事。

    Nant source

    遗憾的是,NAnt 缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual Studio 2010 的新的生成平台)为每种健壮的生成方案进行了准备,...

    生成解决方案的工具(NAnt)

    遗憾的是,NAnt 缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual Studio 2005 的新的生成平台)为每种健壮的生成方案进行了准备,...

    nant-0.90 项目创建生成过程变得容易

    遗憾的是,NAnt 缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual Studio 2005 的新的生成平台)为每种健壮的生成方案进行了准备,...

    Nant 1.0 Alpha

    遗憾的是,NAnt 缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual Studio 2008 的新的生成平台)为每种健壮的生成方案进行了准备,...

    NAntMenu:Windows Shell扩展使用NAnt构建脚本中的目标扩展Windows资源管理器的上下文菜单

    该软件包包含Windows Shell扩展,该扩展使用来自NAnt构建脚本( *.build )的目标来扩展Windows资源管理器的上下文菜单。 上下文菜单:- 列出项目目标并进行描述。 执行所选项目的目标。 编辑构建脚本 启动NAnt...

    Automatic Integration with CruiseControl.NET, NAnt, and NUnit

    ### 自动化集成CruiseControl.NET、NAnt与NUnit:构建持续集成环境 #### 概述 在软件开发过程中,回归测试是一个重要的但经常被忽视的环节。回归测试是指在对已有代码进行修改后重新运行之前的测试用例,以确保...

    使用Visual Studio和Nant构建Xamarin.Android应用程序

    在IT行业中,构建移动应用程序是常见的任务之一,尤其是在使用跨平台框架如Xamarin时,它允许开发者使用C#编写代码,构建原生的Android、iOS和Windows应用。本篇文章将聚焦于如何结合Visual Studio和NAnt工具来构建...

Global site tag (gtag.js) - Google Analytics