自动化每日构建(一)用Ant来完成Delphi工程的每日构建

Delphi开发新纪元:探索持续集成与持续部署的自动化之路 Delphi的CI/CD实践不仅能够提升开发效率,还能够保障软件质量。选择合适的CI/CD工具,并结合Delphi的插件化开发,可以构建出更加灵活、高效的开发流程。随着DevOps文化的深入人心,Delphi开发者将能够享受到更加自动化和现代化的开发体验。通过本文的探讨,我们深入了解了Delphi在CI/CD领域的应用现状和实践方法。希望这能帮助Delphi开发者更好地利用CI/CD工具,构建出更加高质量的软件产品。 阅读详情

Delphi的IDE在一般工程的编译、部署是非常方便的,但是当工程的规模比较庞大时,使用IDE来进行工程的构建就比较费劲了。这时我们可以使用shell脚本来完成这个任务。但是脚本受限制于操作系统平台,管理起来不方便。如果能把所有的项目的构建统一在Ant和NAnt环境下,那么项目的管理效率就可以大大提升,成本就可以大大下降。

每日构建的实际内容应该包括:代码更新、编译、单元测试、打包、冒烟测试等基本内容。下面的构建文件并不包括所有这些内容。

本系列包括用Ant来进行Delphi、Java的每日构建,用NAnt进行.NET的每日构建。

Ant的构建文件Build.xml,使用时可以用实际的工程名替代*****。

 


<project default="usage" basedir=".">

    <!-- =================================================================== -->
    <!-- Initialization target                                               -->
    <!-- =================================================================== -->
    <target name="init">
        <tstamp/>
        <buildnumber/>
        <property environment="env" />
        <property file="build.number"/>
        <!-- You have to fill the ***** space with your project label.  -->
        <property name="Name" value="*****"/>
        <property name="name" value="*****"/>
        <property name="pname" value="*.dpr"/>
        <property name="infofile" value="compiledinfo.txt"/>
        <property name="buildname" value="*****build"/>
        <property name="packname" value="*****"/>
        <property name="dbpackname" value="*****DB"/>
        <property name="year" value="2004"/>


        <echo message="----------- ${Name} Build ${build.number}[${year}] ------------"/>

        <property name="build.compiler" value="modern"/>
        <property name="debug" value="on"/>
        <property name="optimize" value="on"/>
        <property name="deprecation" value="on"/>

        <property name="s.home" value=".."/>
        <property name="s.src" value="${s.home}/src"/>
        <property name="s.srcdelphi" value="${s.home}/src/delphi"/>
        <property name="s.gohome" value="../"/>
        <property name="s.lib" value="${s.home}/lib"/>
        <property name="s.res" value="${s.home}/res"/>
        <property name="s.build" value="${s.home}/build"/>
        <property name="s.run" value="${s.home}/run"/>

        <property name="s.build.assemble" value="${s.build}/assemble"/>
        <property name="s.build.dcu" value="${s.build.assemble}/dcu"/>
        <property name="s.build.bin" value="${s.build.assemble}/bin"/>
        <property name="s.build.gensrc" value="${s.build.assemble}/gen-src"/>
        <property name="s.build.delphidocs" value="${s.build}/apidocs"/>
        <property name="s.build.lib" value="${s.home}/res"/>
        <property name="s.build.release" value="${s.build}/release"/>
        <property name="s.build.web"   value="${s.build}/web"/>
        <property name="s.build.dist"  value="${s.build}/dist"/>
        <property name="s.main" value="com"/>

        <property file="${s.build}/build.properties" />

        <filter token="year" value="${year}"/>
        <filter token="version" value="${version}"/>
        <filter token="date" value="${TODAY}"/>
        <filter token="log" value="true"/>
        <filter token="verbose" value="true"/>

        <path id="s.classpath">
            <fileset dir="${s.lib}">
                <include name="**/*.jar"/>
                <include name="**/*.zip"/>
            </fileset>
        </path>

        <path id="buildtools.classpath">
            <fileset dir="${s.build.lib}">
                <include name="**/*.jar"/>
                <include name="**/*.zip"/>
            </fileset>
            <fileset dir="${s.lib}">
                <include name="**/*.jar"/>
                <include name="**/*.zip"/>
            </fileset>
        </path>

        <tstamp>
            <format property="TODAY" pattern="d-MM-yy"/>
        </tstamp>

    </target>

    <!-- =================================================================== -->
    <!-- Help on usage                                                       -->
    <!-- =================================================================== -->
    <target name="usage">
        <echo message=""/>
        <echo message=""/>
        <echo message="***** Build file"/>
        <echo message="-------------------------------------------------------------"/>
        <echo message=""/>
        <echo message=" available targets are:"/>
        <echo message=""/>
        <echo message="   package   --> generates the *****.zip file (default)"/>
        <echo message="   compile   --> compiles the source code"/>
        <echo message="   test      --> units test"/>
        <echo message="   release   --> build the installation package"/>
        <echo message="   clean     --> cleans up the directory"/>
        <echo message=""/>
        <echo message=" See the comments inside the build.xml file for more details."/>
        <echo message="-------------------------------------------------------------"/>
        <echo message=""/>
        <echo message=""/>
    </target>

 

    <!-- =================================================================== -->
    <!-- Compiles the source directory                                       -->
    <!-- =================================================================== -->
    <target name="compile" depends="init">
        <mkdir dir="${s.build.dcu}"/>
        <mkdir dir="${s.build.bin}"/>
        <echo message=""/>
        <echo message="Compiling application main source..."/>

        <!-- You may change the compile tasks here.  -->
        
        <exec dir="${s.srcdelphi}" executable="dcc32.exe" os="Windows 2000"
              output="${infofile}">
             <arg line=" -B ${pname} 
                 -N${s.gohome}${s.build.dcu} -E${s.gohome}${s.build.bin}
                 -U${s.gohome}${s.build.lib}"/>
        </exec>

  <loadfile property="compiled-info"
            srcFile="${infofile}"/>
       
  <condition property="compile-success">
      <and>
       <contains string="${compiled-info}" substring="seconds"/>
      </and>
    </condition>

  <fail unless="compile-success"
        message="${compiled-info}"/>

    </target>


    <!-- =================================================================== -->
    <!-- Creates the zip package                                             -->
    <!-- =================================================================== -->
    <target name="zip" depends="compile">

        <!-- You may change the package tasks here.  -->

        <mkdir dir="${s.build.assemble}/zip/${buildname}${DSTAMP}/${packname}"/>
        <mkdir dir="${s.build.assemble}/zip/${buildname}${DSTAMP}/${dbpackname}"/>
       
        <copy todir="${s.build.assemble}/zip/${buildname}${DSTAMP}/${packname}">
           <fileset file="${s.build.bin}/*.*"/>
           <fileset dir="${s.lib}" />
        </copy>
       
        <copy todir="${s.build.assemble}/zip/${buildname}${DSTAMP}/${dbpackname}">
           <fileset file="${s.src}/database/*.*"/>
           <fileset file="${s.src}/sql/*.*"/>
        </copy>

        <zip destfile="${s.build.assemble}/zip/${buildname}${DSTAMP}.zip"
             basedir="${s.build.assemble}/zip/${buildname}${DSTAMP}"
             update="true"
        />

    </target>


    <!-- =================================================================== -->
    <!-- Creates the test                                                    -->
    <!-- =================================================================== -->
    <target name="test" depends="compile">

  <!-- You may fill the tasks here.  -->

    </target>


    <!-- =================================================================== -->
    <!-- Creates the deploy                                                  -->
    <!-- =================================================================== -->
    <target name="deploy" depends="">

  <!-- You may fill the tasks here.  -->

    </target>

 

    <!-- =================================================================== -->
    <!-- Build the installation packge                                       -->
    <!-- =================================================================== -->
    <target name="release" depends="clean">

  <!-- You may fill the tasks here.  -->

    </target>

 

    <!-- =================================================================== -->
    <!-- Clean targets                                                       -->
    <!-- =================================================================== -->
    <target name="clean" depends="init">
        <delete dir="${s.build.assemble}"/>
        <delete dir="${s.build.release}"/>
        <delete >
           <fileset dir="." includes="**/compile*.txt"/>
        </delete>
  <!-- You may fill the tasks here.  -->
    </target>


</project>

<!-- End of file -->

 

下面是过去写的一个建立Delphi工程自动化每日构建的帮助文档,内容是英文的。

 

Start a new Delphi project by using Ant

 

This document has 5 sections:

Brief

System requirement

Directories and files

The Build file

Run Ant

 

 

Brief

Start a new Delphi project by using Ant, so we can make Daily Building. All have to do list below:

1.Install Delphi SDK1.4 and new version Ant, and make Ant works.

2.Copy Directories and files from dproject(d for Delphi) template library.

3.Make project files stay in the right directory.

4.Edit the Build.xml file. Let it fit the project.

5.Run Ant.

 

 

System requirement

Delphi SDK1.4 or higher

Ant 1.6 or higher

Delphi 6.0 or higher

 

Directories and files

You can make directories yourself, or copy from template. But make sure the directory tree like this:

Every directory is made for a certain kind of files. Directory names and what kind of files should be put in list below:

Directory        Files should be put in

            Build                building files

            Data                 project’s data files

            Doc                  project‘s documents for installation and deploying

            Lib                   libraries project depending on

            Res                  resources project using

                        Install               resources for installation

            Src                   project’ source files

                        Config              project’s configuration files

                        Database          project’s database files

                        Delphi              project’s Delphi source code files

                        Docs                project’s documents for manager, developer, tester

                        Scripts              project’s script files

                        Sql                   project’s script files for database

           

Now put the Delphi files into the /src/Delphi directory.

 

The Build file

            The build file is /build/build.xml. In the template we already have a default build file. Because every project has different name and different configuration, so we must edit the build file to suit project. We must edit the project name and path in the build file.

 

Run Ant

            After doing that, now start a command-line prompt, change path to ./build, and type ant. We can see a function list like this:

Now Ant runs. We can EDIT the build file to add new features: unit testing, packing, deploying, etc, as you like.

 

每日构建 Daily build 一个好的办法是每日构建(daily builds)。 每日构建意味着自动地,每天,完整地构建整个代码树、(译者按:“代码树”,原文为source tree,意思是将整个项目源代码的目录,子目录,文件的位置尽可能事先固定下来,这样在开发过程中各个模块间,各个文件间的相对位置都不会混乱。源代码树指的就是一个项目所有的已经组织好的代码文件。通常代码树应该用版本控制软件管理起来。虽然这个概念很基本,但是据 阅读详情

相关推荐

【Ant Design Pro 一】 环境搭建,创建一个demo

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 搭建 Ant Design Pro 的前期准备:你的本地环境需要安装 cnpm、node。 注:代码块中的 $ 代表: $后面是在命令行输入的命令,举例 $ npm start 解:实际上是应该打开命令行输入 npm start 下面开始安装部署 Ant Design P...

a_靖的博客 1万+

ant-design-pro 从入门到使用

1、学习经历         用了两周的时间学习nodejs,nodejs是一个脚本语言,有过js基础,所以上手很简单。首先看nodejs开发文档,基本的语法自己也都实现了一遍。然后,第二周用websocket 和串口通信,实现了点击屏幕监控信号灯的功能。第三周开始看ant design pro ,好吧,开始确实无从下手,这里就简单分享下看懂ant-design-pro 并使用的过程。 2、从...

sorrycx 6万+

Delphi代码自动生成 V0.1.zip

Delphi开发中,对于数据库的模型创建向来都比较繁琐,费时的,究其原因就是delphi没有像C#那样针对数据库的模型自动创建工具,为了提高Delphi软件的开发效率,作责开发了这个软件,以供广大delphi开发人员使用,本软件属于本人原创且使用完全免费,如果你愿意,也可以给本人一些资金支持,以帮助我继续完善本软件

ant design入门学习笔记

今天要学习一种新的企业级UI组件——ant design 参考资源https://ant.design/docs/react/introduce 特点 面向Web应用程序的企业级UI设计语言。 开箱即用的一组高品质React组件。 用TypeScript完全定义的类型编写。 整套开发和设计资源和工具。 环境支持 现代浏览器和Internet Explorer 9+(带pol...

CC-lady的博客 4万+

Delphi编写的OLE自动化控制器源代码..rar

Delphi编写的OLE自动化控制器源代码..rar

Java使用Ant批量把文件打成ZIP压缩包

Java使用Ant批量把文件打成ZIP压缩包

最近一直在使用antdesign,说点最基本的吧

获取 form 值  this.getFieldsValue().id 设置form中的值  this.setFieldsValue({'aa':null})   在 this.state{ aa : '1' } 中设置属性 本页面获取值 this.state.aa 关联页面 需要传值 ,传值之后获取方法  this,props.aa 最经常用的貌似就这么多了,等遇到了再补充吧 ...

weixin_37981186的博客 702

晶圆表面缺陷检测现状概述

凹坑,凸起,尖角,沟槽),使用光束对晶圆进行照射,收集反射光和散射光信息进行缺陷判断,进一步可分为无图案晶圆表面检测和宏观缺陷检测设备。KLA使用SR-DUV光,检测精度在10nm以下。扫描电子显微(电子束和晶圆表面产生二次电子,X射线等)获取高分辨率的图像,然后用图像处理表面缺陷(凹坑,凸起,尖角,沟槽等)表面容貌和材料信息,分辨率可达5-10nm。晶圆表面缺陷检测设备主要检测晶圆外观呈现出来的缺陷,损伤、毛刺等缺陷,主要设备供应商KLA,AMAT,日立等,其中KLA在晶圆表面检测设备占有市场52%左右。

qq_36786800的博客 1万+

【测试—自动化测试】每日构建与自动发布_02

客户端程序每日构建的目的:解决客户端程序更新频率太高,人工工作量太大解决客户端程序,程序资源,美术资源,策划资源的合入,打包发布混乱的问题版本质量不稳定,为后续引入自动测试打下基础每日构建工具:构建管理工具CruiseControl.NET ( 服务端:CruiseControl.NET-1.4.4-RC2-Setup.exe      客户端:CruiseControl.NET-CCTray-1

肖红超的地盘 529

PM1132-220V转5V电源芯片:SOT-23-3封装的高效电源解决方案

在现代电子设备小型化和高效化的趋势下,PM1132芯片凭借其的能力与特性,成为工业控制IoT设备及便携电器的理想电源管理方案。以下从核心技术设计挑战和应用实践展开分析。

M_D13Z476I000l的博客 804

KV Cache 详解:新手也能理解的 LLM 推理加速技巧

(Autoregressive)生成的,即每次生成一个 token,然后将其作为输入继续生成下一个 token。:如果序列太长,超过了 KV Cache 的存储限制,就需要丢弃最早的 tokens(类似滑动窗口)。时,每次只会生成一个新 token,然后再把这个 token 作为输入继续生成下一个 token。,只缓存计算过的 K,VK, V,每次只计算新 token 的 K,VK, V,从而提升推理效率。:如果输入的 prompt 发生变化,之前的 KV Cache 不能复用,必须重新计算。

Harry的博客 7361

Delphi COM编程技术四自动化技术

一、自动化技术的基础 1、 自动化名称介绍: 1>、自动化: 是一种从应用程序的内部自动控制另一个应用程序的方法。 2>、自动化对象: 指的是实现了IDispatch接口的COM对象,IDispatch接口是自动化对象的一个重要标志。因此,可以通过QuereyInterf

xiongmao000738 2627

STM32 BLDC无刷电机霍尔信号捕获与换相控制实战解析

本文深入解析了STM32如何实现BLDC无刷电机的霍尔信号捕获与换相控制。详细阐述了硬件接口配置、定时器霍尔传感器模式的使用、抗干扰的滤波器与软件容错设计,以及中断服务与换相逻辑的实战代码。重点解决了信号抖动、换相不准等常见问题,旨在帮助开发者构建稳定可靠的电机驱动基础。

weixin_29193259的博客 368

“一键运行” ——全面自动化delphi开发环境 -

  在平台和产品合作开发的模式下,产品并不拥有全部代码。因此有些产品的问题,需要和平台代码联调,如果环境搭配对了,解决问题往往是比较容易的事情。但是没有调试环境下,仅仅静态查看代码就常常陷入僵局。 因此,环境安装是平台和产品程序员顺利高效合作的重要部分。这里面最为重要的是一键运行——拿来代码,打开工程,按Run——然后该干嘛干嘛。   但是现在的情况并不乐观。局部来自于delphi...

Optimize sight,Refactor , DB Turning 326

COMSOL金属氢化物-放氢过程

"层流"的出口设置压降函数,解决“找不到一致的初始值”问题,主要是一开始设置出口为1atm的话,压力场过渡太剧烈,不好找到初始解,要么就先算个稳态流场,这种也能求解。注:P0是根据实测PCT的插值曲线(函数名称为:p_iso)得到的,根据初始质量储氢量wtw0,和初始温度条件T0,然后根据函数p_iso(wtw0)*exp(-deltHd/R_const*(1/T0-1/303.15[K]))求解获得。若"初始步长"选择框不勾上,前面0~5s内的求解容易发散,然后求解失败。2、设置"达西定律"的。

qq_24800941的博客 1929

硬件基础——mos管

文章目录前言一、寄生参数二、使用步骤1.引入库2.读入数据总结 前言 MOS管设计重点 一、寄生参数 1.寄生电容 mos管有寄生电容Cgs,此电容大小一般为pF级别,一般规格书可以查到。 使用时,要特别注意GS管教的寄生电容Cgs,控制MOS管的导通与截止,本质上是控制Cgs电容的充放电。(最好要加限流) 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt imp

Malqaq的博客 6599

使用Want自动编译Delphi

什么是Want Want是一套Windows下用于编译Delphi源代码的工具.Want的名称是Windows Ant的意思. Ant是Java下最著名的自动编译工具,因此作者起名为Want. Want使用 首先,我们需要使用dof2want.exe来把dof文件转换到xml文件。首先,把文件复制到程序根目录下: 随后打开命令提示符,转到程序根目录,执行如下命令:...

sky2012lty的博客 392

SQL Prompt 9.0插件突然无法使用解决办法(附防联网激活)多图+文字

可能由于Redgate公司最近抓盗版抓得严,导致激活后的SQL Prompt联网后突然无法使用,无论卸载重装都没办法继续使用,本人同时使用SQL Assistant和SQL Prompt,我喜欢SQL Assistant代码提示功能,而SQL Prompt我喜欢将查询结果复制后可以直接生产插入脚本,这是最爽的一件事,即便对表有多么熟悉,没有这些插件,几行语法都要敲大半天,目前本人已经离不开这两个插...

骚团长的博客 1万+

用Delphi在工业控制和自动化实现多线程进行数据采集 (转)

用Delphi在工业控制和自动化实现多线程进行数据采集 (转)[@more@] 数据采集技术在工业控制及自动化等领域中发挥着重要的作用。数据采集的一般过程是这样的: ①向采集卡发出通道选择指令。②选择要采集的通道号。③启动A...

circularr9834的博客 298

第16课:动手实战中文句法依存分析

句法分析是自然语言处理(NLP)中的关键技术之一,其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系。主要包括两方面的内容:一是确定语言的语法体系,即对语言中合法句子的语法结构给予形式化的定义;另一方面是句法分析技术,即根据给定的语法体系,自动推导出句子的句法结构,分析句子所包含的句法单位和这些句法单位之间的关系。 句法分析被用在很多场景中,比如搜索引擎用户日志分析和关键词识别,比如信息抽...

春华秋实 2437

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

自动化每日构建(二)用Ant来完成java工程的每日构建

过去写的文章,不过是英文的。后面有附带的build.xml文件。   Start a new Java project by using Ant   This document has 5 sections: Brief System requirement Directories and files The Build file Run Ant     Brief Start a new Jav

以梦为马 2655

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ant中调用外部ant任务的两种方法

在ant脚本中对外部ant任务的调用,在多项目管理中特别有用。两种方法总结一下:使用antfile、使用exec 一:使用antfile                            dir="${project1dir}"              inheritall="false"              inheritrefs="false" 

以梦为马 9643

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

下一篇: 自动化每日构建(二)用Ant来完成java工程的每日构建
samlei
博客等级 码龄26年 29粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值