一、前言

    以前版本管理常用的软件是微软出品的vss和开源的cvs,svn是后来逐步发展起来的版本管理工具,根据对svn的介绍,svn是一些对cvs固有缺陷不满意的开发者总结了一些cvs的不足进一步开发的版本工具。

    如果对svn有进一步兴趣,这里有对svn的介绍:svn介绍资料

    svn一样是开源的,且有愈来愈流行的趋势,不少新的项目基本上都使用了svn来作为版本管理工具,因为其开源,有不少人在开发相应的服务端和客户端,从而有多种服务端和客户端软件可选; 相信因为如此,axure才会采用svn作为版本管理的承载,因此才会有基于svn server搭建axure共享项目的可能性。

    svn的官方网址网址如下:svn官方网站

   Axure RP所需要使用的是svn服务器,如果已经有搭建好的svn服务器,则可以直接使用,如果没有,则需要搭建一个svn服务器。

    这里给出一个在windows下搭建svn服务器的示例,如果想要更多了解,则可以搜索svn相关的资料,svn服务器一样可以在Linux下搭建。

二、windows下搭建svn server

 

   在svn的官方网站提供了多种服务器端供选择,盆地选用了其中有gui界面的svn服务器VisualSvn,其官方地址如下:VisualSvn官方地址。

    VisualSvn的服务器端是免费的,客户端是收费的,我们目前只需要服务器端。

   其安装过程是标准的windows安装过程,不再赘述。

1.主界面

 

2.Visual的属性

 

3. 可以设置服务器端内容存放位置

 

4.可以设置密码验证方式,请选svn验证方式

   根据svn的官方介绍,其服务是基于apache的,盆地安装VisualSvn后已经直接可用了,由于盆地已经安装过apache,所以不确认是否一定要安装apache;如果不能使用,请安装apache,最好同时安装php,因为下面用户自助修改密码的功能是需要apache和php环境的。

    简便起见可以安装架站套件xampp或appserv,其已经同时包含了apache和php。

三、svn server的用户密码管理

    svn有自己的一套管理机制,关于权限、目录访问等,有兴趣可以搜索相关资料,其默认情况下用户的密码是只能管理员设置的,这点和cvs一样非常不方便。

   这里谨根据网络资料介绍如何为用户提供自助修改密码的功能,其原理是通过apache可以调用系统命令的方式,通过调用系统命令修改用户名密码;通过basice认证关联密码文件的方式做用户认证。

    1.修改apache的conf目录下的httpd.conf,在最后增加如下代码。第一行的意思是设定一个http访问的路径svntools,以后会通过访问http://localhost/svntools来访问自助修改密码的功能,后面几行的设定访问上述路径时的验证方式,设定为必须需要输入原用户名和密码验证密码成功后才可以进行修改密码的工作,其中密码文件使用svn server的密码文件htpasswd。

Alias /svntools "C:/Repositories/svntools"<Directory "C:/Repositories/svntools/">allow from allRequire valid-userAuthType BasicAuthName "Subversion Tools"AuthUserFile C:/Repositories/htpasswd</Directory>

   2.在相应svn server目录"c:/Repositories"中增加一个目录svntools,在其中创建一个文件 index.php,内容如下(需要根据实际情况修改相应目录),对于Linux适当修改也可以使用。

<?/*Alias /svnmodify "E:/svn/"<Directory "E:/svn/">Require valid-userAuthType BasicAuthName "Subversion Tools"AuthUserFile e:/svn/config/htpasswd.conf</Directory>*/?><?$username = $_SERVER["PHP_AUTH_USER"]; //经过 AuthType Basic 认证的用户名$authed_pass = $_SERVER["PHP_AUTH_PW"]; //经过 AuthType Basic 认证的密码$input_oldpass = (isset($_REQUEST["oldpass"]) ? $_REQUEST["oldpass"] : ""); //从界面上输入的原密码$newpass = (isset($_REQUEST["newpass"]) ? $_REQUEST["newpass"] : ""); //界面上输入的新密码$repeatpass = (isset($_REQUEST["repeatpass"]) ? $_REQUEST["repeatpass"] : ""); //界面上输入的重复密码$action = (isset($_REQUEST["action"]) ? $_REQUEST["action"] : ""); //以hide方式提交到服务器的actionif($action!="modify"){$action = "view";}else if($authed_pass!=$input_oldpass){$action = "oldpasswrong";}else if(empty($newpass)){$action = "passempty";}else if($newpass!=$repeatpass){$action = "passnotsame";}else{$action = "modify";}?><html><head><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>Subversion 在线自助密码修改</title></head><body><?//action=view 显示普通的输入信息if ($action == "view"){?><script language = "javaScript"><!--function loginIn(myform){var newpass=myform.newpass.value;var repeatpass=myform.repeatpass.value;if(newpass==""){alert("请输入密码!");return false;}if(repeatpass==""){alert("请重复输入密码!");return false;}if(newpass!=repeatpass){alert("两次输入密码不一致,请重新输入!");return false;}return true;}//--></script><style type="text/css"><!--table {border: 1px solid #CCCCCC;background-color: #f9f9f9;text-align: center;vertical-align: middle;font-size: 9pt;line-height: 15px;}th {font-weight: bold;line-height: 20px;border-top-width: 1px;border-right-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-bottom-style: solid;color: #333333;background-color: f6f6f6;}input{height: 18px;}.button {height: 20px;}--></style><br><br><br><form method="post"><input type="hidden" name="action" value="modify"/><table width="220" cellpadding="3" cellspacing="8" align="center"><tr><th colspan=2>Subversion 密码修改</th></tr><tr><td>用 户 名:</td><td align="left"> <?=$username?></td></tr><tr><td>原 密 码:</td><td><input type=password size=12 name=oldpass></td></tr><tr><td>用户密码:</td><td><input type=password size=12 name=newpass></td></tr><tr><td>确认密码:</td><td><input type=password size=12 name=repeatpass></td></tr><tr><td colspan=2><input onclick="return loginIn(this.form)" class="button" type=submit value="修 改"><input name="reset" type=reset class="button" value="取 消"></td></tr></table></form><?}else if($action == "oldpasswrong"){$msg="原密码错误!";}else if($action == "passempty"){$msg="请输入新密码!";}else if($action == "passnotsame"){$msg="两次输入密码不一致,请重新输入!";}else{$passwdfile="C:/Repositories/htpasswd";$command='"D:/xampp/apache/bin/htpasswd.exe" -b '.$passwdfile." ".$username." ".$newpass;system($command, $result);if($result==0){$msg="用户[".$username."]密码修改成功,请用新密码登陆.";}else{$msg="用户[".$username."]密码修改失败,返回值为".$result.",请和管理员联系!";}}if (isset($msg)){?><script language="javaScript"><!--alert("<?=$msg?>");window.location.href="<?=$_SERVER["PHP_SELF"]?>"//--></script><?}?></body></html>

 

3. 如果一切配置无误的话,访问http://localhost/svntools则出现如下界面:

如果输入密码正确,则会看到如下界面,这里可以进行密码修改,即Axure RP的用户可以用初始密码登录,登录后设置自己的密码。

 

四、共享项目

    在svn server搭建好的情况下,我们可以开始创建共享项目并在创建后获取共享项目。互联网上也提供公共svn服务的站点,例如google code、sourceforge.net等。

    其中google code不支持"svn lock",所以无法使用在Axure rp中; sorueceforge.net盆地还未试验过,今天刚刚注册了soureforege.net,但申请的项目需要几天的审核期,当前尚且未知axure rp是否可以用在soureforce上,有待进一步验证。

    5.4更新: sourceforge.net经过试验,在创建共享项目已经已经失败。相比之下google code要进步一些,可以成功创建,但是无法获取共享项目和执行日常操作。

五、创建共享项目

    1.在Svn服务器例如VisualSvn中先建立计划创建的项目

 

 

    2.在Axure RP菜单项中选择”Create Shared Project from Current File”

 

    3.设定Share Project的项目名称,项目名称应该和刚才在Svn Server种创建的项目名称一致

 

    4.设定Share Porject的共享项目在服务器的路径,这个路径即svn server中对应项目的路径,示例见下图

 

    5.如果输入无误,点击"Next"进行下一步时,会弹出输入用户名密码的输入框

 

    6.输入正确的用户名和密码后,可以选择共享项目在本地的存放路径,这个路径中会生成和共享项目名称相同的子目录,并保存最后一次的更改状态;

    下图中的路径为”E:/axure”,这里有一部分被Axure RP遮盖住了。后续可直接打开此目录下后缀为".rpprj"的文件来查看项目,不需要每次都重新生成项目。

 

    7.点击"Finish"会开始创建项目,创建完成后会提示创建成功。

 

    备注:还有一种创建方法如下

    a.采用基于windows共享文件的方法生成共享项目放在本地

    b.在Svn Server中采用导入的方法生成共享项目

六、获取共享项目

    1.在Axure RP中从”Share”菜单项中选择”Get and Open Shared Project…”

 

 

 

    2.选择共享项目在svn服务器中所在路径,这里的路径中要输入两次“SvnProject”。如果创建方法采用方法二创建,则只需要输入一次SvnProject目录名。这是由于创建共享项目的路径不一致引起的。

    3.如果没有输入过用户名密码,则这里会弹出用户名和密码的输入框;如果已经输入过或者输入成功,则进入设定共享项目本地存放路径的界面,这里和基于windows文件共享获取共享项目的方式一致。

 

    点击”Finish”,此时我们完成了共享库的获取;

    至此我们描述了基于Svn Server创建和获取共享项目的整个过程,下一篇盆地计划介绍一下共享项目的一些日常使用方法。