看了Joel Spolsky的《软件开发成功12法则》和《Daily Builds are Your Friend》,对于每日构建的必要性和实用性都深有感触。于是为自己的项目添加脚本以实现快捷的每日构建,并记述这个尝试的整个过程,方便以后参考。
所谓的每日构建就是每天至少一次的重新创建整个工程,每日构建本身只能算是一个保护代码有效性和快速修改快速出品的手段,但是要想快速将项目成果由代码构建成最终出品形式(如安装程序,CD镜像等)就需要一套工具的支持还有相应脚本的设定,每日构建需要做的工作正是实现这个过程。
每日构建过程中有很多环节,基础流程是从源代码管理系统中取出最新版本的源码,然后通过编译器编译,最后使用安装程序打包。我首先由从源代码管理系统中取出最新版本的源码开始。
这里讲解的是Visual SourceSafe的流程。
VSS本身有Command Line模式,按照帮助文档中的说法,Command Line的命令可以实现VSS界面程序的所有功能。而我现在只需要他的Get(获取最近版本),命令行如下:
ss get $/vss_code -I-Y -R -GLc:\daily_build_code -O@mycode.log
|
|
Ss |
VSS Command Line模式的启动程序名 |
Get |
获取最近版本的命令名称 |
$/vss_code |
希望获取的程序路径,该路径可以通过VSS窗体程序的右键属性功能获取 |
-I-Y |
对提问回答Y,如果没有这个参数则运行命令会在提问时等待用户输入。回答N,是-I-N |
-R |
递归获取,会把该目录下的所有子目录都取出来 |
-GLc:\daily_build_code |
用来指定获取源码的路径,如果不设置则使用VSS的默认工作目录 |
-O@mycode.log |
指定所有信息输出到log文件 |
注意1:这里指定了工作路径,一般来说为了构建能够不受原有环境的影响,最好每次构建都重新建立路径。如果有可能应该专门提供一台机器用来做每日的构建。
注意2:如果不指定log文件的绝对路径的时候,log文件会被建立到当前路径,如果你频繁的使用cd,md命令很可能会使这个位置不确定,所以建议使用绝对路径来指定log文件的位置。
以上的命令虽然是用来获取最近版本的,但在现实中还需要设置当前的环境变量。
如果你的VSS的服务端不在本机,需要指定服务路径,如下:
set ssdir=\\my_vss_server\vss_code
还需要指定用户名和密码,如下:
set ssuser = snail
set sspwd = chinaos.com
另外,如果你没有将VSS路径加入系统设置中,需要指定VSS路径:
set path=c:\program files\microsoft visual studio\common\vss\win32\
最后要注意的是,因为指定了新的工作路径,你需要保证该目录的有效性。
这些工作都做完,得到的脚本用批处理表现出来就像下面的样子:
// vss.bat
set ssdir=\\my_vss_server\vss_code
set ssuser=snail
set sspwd = chinaos.com
set path=c:\program files\microsoft visual studio\common\vss\win32\
c:
cd \
md daily_build_code
ss get $/vss_code -I-Y -R -GLc:\daily_build_code -O@mycode.log
VSS Common Line提供的其他命令和参数,请参看VSS的帮助文档
之前我们已经获取了当前项目的所有的代码,并把他们放入了指定的目录。下面是如何构建这些代码。本文以介绍VC的批处理过程,要注意的是,VC6的处理过程和VC.NET是不同,首先我们来看VC6如何命令行构建代码。
1. 创建mak文件
直接使用VC6的项目文件是无法在命令行编译的,所以要先导成.mak文件。
在VC IDE的菜单中有导出的功能,他会在工程目录下生成一个对应的mak文件。另外,在VC的设置中可以设置保存项目文件同时导出mak文件,选中这个功能你的mak文件和项目文件就同步了。
最后一个工作就是把mak文件加入版本管理软件。这是应该还有一个dep文件,它描述了项目中文件的依赖项,由于这些项使用的都是相对路径,是个相当危险的东西,建议不加入,虽然这样编译的时候会出现找不到.dep文件的提示。
需要注意的是,当你的项目在版本管理软件控制下,如果mak文件没有Check Out,导出失败是没有提示的,所以在工程文件Check Out的时候,同时Check Out mak文件是一个必须养成的好习惯。
2. 设置编译路径
如果在安装的时候没有选择设置环境变量的选项,则需要在编译程序运行之前设置编译所需路径。
VC的标准路径,VC6保存在VC98\bin\VCVARS32.BAT中,可以将BAT中的内容直接拷贝到自己的脚本里。标准脚本如下:
@echo off
rem
rem Root of Visual Developer Studio Common files.
set VSCommonDir=C:\PROGRA~1\MICROS~3\Common
rem
rem Root of Visual Developer Studio installed files.
rem
set MSDevDir=C:\PROGRA~1\MICROS~3\Common\msdev98
rem
rem Root of Visual C++ installed files.
rem
set MSVCDir=C:\PROGRA~1\MICROS~3\VC98
rem
rem VcOsDir is used to help create either a Windows 95 or Windows NT specific path.
rem
set VcOsDir=WIN95
if "%OS%" == "Windows_NT" set VcOsDir=WINNT
rem
echo Setting environment for using Microsoft Visual C++ tools.
rem
if"%OS%"=="Windows_NT" set PATH = %MSDevDir%\BIN;%MSVCDir%\BIN;%VSCommonDir%\TOOLS\%VcOsDir%;%VSCommonDir%\TOOLS;%PATH%
if "%OS%" == "" set PATH="%MSDevDir%\BIN";"%MSVCDir%\BIN";"%VSCommonDir%\TOOLS\%VcOsDir%";"%VSCommonDir%\TOOLS";"%windir%\SYSTEM";"%PATH%"
set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE%
set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB%
set VcOsDir=
set VSCommonDir=
然后需要添加自定义的路径,对应VC中的路径设置项%PATH%前面添加Executable files;%INCLUDE%前面添建Include files; %LIB%前面添加Library files。
注意:如果使用了类似#import <msxml3.dll>的指令,一定要在%PATH%前面添加windows的系统路径:
%windir%\System32
3. 使用namke.exe构建
编译目录设置之后,就可以直接使用一下命令构建工程:
nmake myproject.mak
使用-clean参数清除编译项:
nmake –clean myproject.mak
使用CFG来设置编译设置
nmake mapchina.mak CFG="MyProject – Win32 Debug"
注意:CFG的值可以从mak文件和工程文件中获得。Mak文件包含一个默认的设置,如果没有提供CFG的值,将会使用这个默认设置编译。
nmake提供的其他命令和参数,请参看MSDN的相关文档