刘军华,尹 根
(湖南邮电职业技术学院,湖南长沙410015)
软件项目的开发通常是由多人协作分工完成的,在此过程中每个项目参与人都会创建大量的源代码和文档。如何在不使用SVN 服务端(VisualSVNServer)的情况下,对由多人共同编写的源代码和文档进行有效地管理和维护成了困扰开发者的一大难题。比如,在高职院校技能竞赛的移动互联网应用软件开发、Web 应用软件开发、物联网技术应用等多个赛项中,就会涉及到要将多个选手编写的项目代码快速整合到一起的工作,让许多参赛选手感到有些棘手[1]。本文以TortoiseSVN 免费开源的版本控制软件为例,提出了在Android Studio 开发工具实现项目版本控制的参考方法。
SVN 是Subversion 的缩写,是一个免费开源的版本控制软件[2]。TortoiseSVN 是SVN 版本控制软件的一个开源客户端,可以超越时间进行文件和目录管理。文件保存在中央版本库,版本库就像一个文件服务器,除了能记住文件和目录的每次修改,还可以通过检查历史知道数据作了哪些修改以及是谁做的修改,且将文件恢复到过去的版本,因此也被称为“时间机器”[3]。
版本库(Repository):也称代码库,存储库,中央版本库,是源代码统一存放的地方。它采用分层“文件——目录”文件树形式来存储数据,版本库中存储了项目的所有数据,如项目源代码和文档等。每一个项目都是版本库的子目录,库中记录了每个用户的每一次修改。连接到版本库的用户都能读写这些数据,都能从版本库中提取项目或提交项目到版本库中去[4]。
工作拷贝(Working copy):也称工作副本。与中央版本库相对应的,它是开发者在本地机器上的一个文件目录,里面存放着从版本库中获得的源代码和文档的一个副本,开发者可以在本地查看、修改、编译、运行和调试,完成后再把新版本的源代码和文档提交到中央版本库。
提取(Checkout):也称签出。从版本库中获得要修改的文档或源代码等文件的过程称为提取。
提交(Commit):也称签入。将已经修改好的文档或源代码等文件存入到版本库中的过程称为提交。
更新(Update):也称同步。将版本库中的最新版本下载到本地,以确保本地的工作副本与版本库中的源代码保持一致。一般在提交之前建议先更新,否则其它用户上传的新版本在你没有更新的情况下就会被覆盖,导致数据丢失。
使用TortoiseSVN 客户端软件在服务器上建立一个版本库,版本库里可以存放许多不同项目的源代码和文档资源,由版本库管理员根据项目的配置管理计划,为项目成员分配相应的访问权限以及对这些资源进行统一管理,每个版本库有一个唯一的URL 标识,项目成员通过URL 访问版本库中的资源[5]。其工作原理如图1 所示。用户在使用版本库之前,首先要把版本库里的项目文件提取到本地,也可称为一个工作拷贝,然后在本地进行必要的修改,最后再通过提交功能将数据存入到版本库。由于版本库是集中式管理,任何修改都在本地进行,在修改未被提交到服务器前,服务器不会把当次修改与其他人的数据合并,也不会把当次修改展示给别人。因此,每次提交时,TortoiseSVN 都会将提交项目资源的版本与原有版本进行比较,如果有修改则记录修改内容,并更新版本号,这样就实现了历史操作的记录,项目成员可以从版本库中提取以往的任一版本。
图1 TortoiseSVN 工作原理图
一般情况下,搭建SVN 环境需安装SVN 服务端(VisualSVN-Server)和SVN 客户端(TortoiseSVN)两款软件。但是如果项目组开发人员的电脑在同一个局域网中,只使用TortoiseSVN 客户端也能搭建一个局域网服务器,以实现对项目代码的统一管理。下面介绍在Window7 下TortoiseSVN 客户端安装与配置方法。
进入到TortoiseSVN 官网下载TortoiseSVN 客户端安装文件。网站中提供了32 位和64 位安装包以及中文语言补丁。下载完成后直接运行安装包,根据向导提示安装即可。安装过程中,在图2 显示的这步中要选择“Will be installed on local hard drive”。只有安装带有command line 功能的TortoiseSVN 客户端,才能在Android Studio 中使用。
图2 TortoiseSVN 安装向导图
3.2.1 搭建仓库目录
新建一个空白目录Demo 做"仓库"(如E:Demo),在Demo 目录中按下鼠标右键,依次选择"TortoiseSVN->Create Repository here"。会自动生成对应的文件,完成后,直接点击OK 即可。如图3 所示。
图3 创建仓库目录图
其中:
*conf 目录:仓库配置文件所在目录(如仓库的用户访问账号、权限等)。
*db 目录:所有版本控制的数据存放目录。
*hooks 目录:放置hook 脚本文件的目录。
*locks 目录:用来放置SVN 文件库锁定数据的目录,用来追踪存取文件库的客户端。
*format 文件:一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号。
3.2.2 配置服务器
以记事本的方式打开仓库目录下的conf/svn serve.conf 文件,在[general]节点下,去掉以下四行文本前的#和空格。
anon-access=none //将read 改为none,设置未验证用户无任何权限
auth-access=write //设置已验证用户给予写权限
password-db=passwd //将密码数据存放到passwd 文件中
authz-db=authz //将权限设置存放到authz 文件
3.2.3 配置用户
以记事本的方式打开仓库目录下的conf/passwd文件,在[users]节点下,添加用户名和密码。如:
admin=admin //设置admin 用户名的密码为admin
user1=1234 //设置user1 用户名的密码为1234
3.2.4 配置组和权限
以记事本的方式打开仓库目录下的conf/authz 文件,在[groups]节点下设置组名及其成员。如:
teacher=admin,user1 //设置teacher 组的成员包括admin 和user1。其中成员名必须是在passwd 文件已定义的用户名,该项设置为可选项。
另外,还要添加对仓库目录的访问权限。如:
[/] //表示仓库的根目录
@teacher=rw //表示teacher 组的用户对资源库所有的资源拥有读写权,其中组名必须是在[groups]节点下已定义的组名,使用时要在组名前面加上@符号。
*=rw //表示所有用户都具有读写权限
3.2.5 启动服务
为了便于客户端稳定访问服务器,将SVN 服务配置成Windows 系统服务。可以通过如下命令创建。
sc create svnservice binpath="C:Program FilesTortoiseSVNinsvnserve.exe -- service -r E:Demo"//创建一个名为svnservice 的SVN 服务,svnservice 为服务名称,E:Demo 为版本库的路径。
net start svnservice //启动svnservice 服务
若有删除服务,可以使用sc delete"svnservice"命令。为了操作方便,可以将上述创建和删除命令分别写入到两个bat 文件中,双击bat 文件即可实现启动或删除服务。
3.2.6 访问测试
在创建SVN 服务并启动后,就可以对仓库进行访问浏览。在桌面或任意位置空白处右键,依次选择“TortoiseSVN->Repo-browser”菜单。在弹出的URL对话框中输入要访问的SVN 服务器地址,如:svn://192.168.0.101。输入完成后,点击“OK”按钮,将弹出用户验证对话框。输入设置的用户名和密码后,如输入在passwd 文件中设置的用户名(admin)和密码(admin),即可打开仓库浏览,至此,配置全部完成,可以进行签入或签出操作了。
Android Studio(简称为AS)是Google 公司2013年推出的一款Android 集成开发工具,它支持SVN 和GIT 两种版本控制方式,两者都需要在AS 中进行相应的配置,才能与版本库中进行checkout、commit 等操作。
打开Android Studio 的Settings 配置面板,依次点击“Version Control-->SubVersion”菜单项,在Use command line client 选择TortoiseSVN 安装的路径,一般默认安装路径为“C:Program FilesTortoiseSVNinsvn.exe”。
将一个AS 项目导入到TortoiseSVN 版本库有多种方法,既可以在项目所在文件夹上点击右键,依次选择“TortoiseSVN->import…”,又可以先用AS 打开项目后再直接导入或关联导入。直接导入和关联导入的最大区别在于直接导入的项目与SVN 服务器没有建立起关联,直接将项目代码提交到SVN 服务器,而关联导入的项目则是先与SVN 服务器建立连接,然后再将项目代码提交到SVN 服务器。另外,由于Android 项目中很多内容是通过gradle 和build 工具构建出的安装程序,这些程序占用了很多空间,强烈建议不要将这些文件提交到SVN 服务器,这些需要忽略的文件主要包括.idea 文件夹、.gradle 文件夹、所有的build 文件夹、所有的.iml 文件以local.properties文件。下面以直接导入方法为例,介绍在AS 中导入项目到版本库的操作方法。
打开AS 集成开发环境,依次点击“VCS-->Import Into Version Control->Import into Subversion”菜单项,将打开Import into Subversion 对话框,选择要导入的版本库路径,然后单击“Import”按钮,即可选择要导入项目所在的根目录,完成导入,如图4所示。由于直接导入不能很好地忽略指定的文件列表,可以在项目导入完成后,再在SVN 版本库中删除需要忽略的文件或文件夹。在AS 集成开发环境中,依次点击“VCS -> Browse VCS Repository ->Browse Subversion Repository”菜单项,可以直接浏览SVN 上的内容。
图4 AS 中导入项目到SVN 服务器示意图
将一个TortoiseSVN 版本库中的项目提取到本地有多种方法,既可以在桌面或任意文件夹的空白处点击右键,然后点击弹出菜单中“SVN Checkout”,又可以在AS 欢迎界面“Check out project from Version Control”选项下选择“Subversion”或者在打开AS 集成开发环境后,再依次点击“VCS->Checkout from Version Control->Subversion”。
从SVN 服务器中提取项目到本地后,该项目即与SVN 服务器保持连接,可实时从服务器下载文件,也可上传文件到服务器。为了便于用户快速区分文件是否与服务器同步,AS 集成开发环境中用不同颜色标识文件和文件夹,其中绿色表示新文件但没有提交,蓝色表示该文件有修改但没有提交,红色表示该文件没有加入版本控制VCS 中的新文件,褐色或灰色表示已忽略文件,黑色表示该文件与服务器同步。
在局域网中,仅用TortoiseSVN 客户端软件也能搭建一个本地服务器,以解决多人共同开发同一个Android Studio 软件项目过程中出现的版本混乱、代码整合难等问题,实现对项目源代码和文档的集中式管理,提高软件开发效率。