﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-局部变量的作用域-随笔分类-配置管理</title><link>http://www.cppblog.com/localvar/category/15388.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 09 Nov 2010 02:04:53 GMT</lastBuildDate><pubDate>Tue, 09 Nov 2010 02:04:53 GMT</pubDate><ttl>60</ttl><item><title>编译选项的统一管理：Property Manager</title><link>http://www.cppblog.com/localvar/archive/2008/12/31/132769.html</link><dc:creator>局部变量</dc:creator><author>局部变量</author><pubDate>Wed, 31 Dec 2008 03:04:00 GMT</pubDate><guid>http://www.cppblog.com/localvar/archive/2008/12/31/132769.html</guid><wfw:comment>http://www.cppblog.com/localvar/comments/132769.html</wfw:comment><comments>http://www.cppblog.com/localvar/archive/2008/12/31/132769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/localvar/comments/commentRss/132769.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/localvar/services/trackbacks/132769.html</trackback:ping><description><![CDATA[<p>当一个solution中的project越来越多以后，管理编译选项，将成为一件很麻烦的事，单独对每个project进行设置不仅繁琐，而且容易出错。但实际上，visual studio已经为我们提过了统一的管理界面—Property Manager。</p>
<p>在visual studio中，每个c++ project的general属性页中，都有一项"Inherited Project Property Sheets"，我们可以在这里指定一个或多个Property Sheet（不要和GUI开发中的Property Sheet搞混了，完全两个概念）供项目继承。在被继承的属性表（父属性表）中，我们设置好默认选项，然后把project中对应的选项设置为"inherit from parent or project defaults&#8221;就可以使用父属性表中的设置了。这样，在solution层面上准备一个Property Sheet，再让其下的所有project继承，即可实现编译选项的统一管理。</p>
<p>在visual studio的view菜单中选择property manager，还可以更清楚的看到每个project继承了哪些property sheet，并且有更多的编辑功能（如创建新property sheet、清除project已经设置了的选项等）。另外，property sheet还支持多级继承，而实践上一般也是每个solution一个根Property Sheet，然后为每个Configruation（Debug版、Release版等）分别派生出一个，各个project的不同Configruation继承对应的Property Sheet。</p>
<p>最后要注意的就是：property sheet的保存文件（.vsprops），也是应该加入配置管理系统的。</p>
<img src="http://blog.vckbase.com/localvar/aggbug/36154.html" width=1 height=1> 
<img src ="http://www.cppblog.com/localvar/aggbug/132769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/localvar/" target="_blank">局部变量</a> 2008-12-31 11:04 <a href="http://www.cppblog.com/localvar/archive/2008/12/31/132769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SVN实现版本号自增</title><link>http://www.cppblog.com/localvar/archive/2008/05/20/132755.html</link><dc:creator>局部变量</dc:creator><author>局部变量</author><pubDate>Tue, 20 May 2008 01:12:00 GMT</pubDate><guid>http://www.cppblog.com/localvar/archive/2008/05/20/132755.html</guid><wfw:comment>http://www.cppblog.com/localvar/comments/132755.html</wfw:comment><comments>http://www.cppblog.com/localvar/archive/2008/05/20/132755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/localvar/comments/commentRss/132755.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/localvar/services/trackbacks/132755.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;在《介绍一下SVN》一文中，我提到了自动递增版本号的功能，现在就来具体说明一下实现方法。虽然标题中说的是&#8220;使用SVN&#8221;，但我们实际用的是SVN的客户端工具TortoiseSVN中的SubWCRev程序。另外文中的例子也使用了Visual Studio的SVN插件VisualSVN，它并非必须，用了方便一些，不用也行。我平时主要使用C/C++语言，但考虑C#有更大的用户群，我的示例项目也采用了C#。
<h3></h3>
<h4>1.&nbsp;生成一个名为autover的项目</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;注意项目的Properties文件夹下有一个名为AssemblyInfo.cs的文件，autover程序的版本号就写在它里面。</p>
<img src="http://www.cppblog.com/images/vckbase_com/localvar/1234/o_image001.jpg">
<h4>2.&nbsp;创建模板文件</h4>
<p>在windows的资源管理器中进入Properties文件夹，把AssemblyInfo.cs文件复制一份，命名为AssemblyInfo.template.cs，并把它加入到项目中来。</p>
<img src="http://www.cppblog.com/images/vckbase_com/localvar/1234/o_image002.jpg">
<h4>3.&nbsp;修改AssemblyInfo.template.cs的属性</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;AssemblyInfo.template.cs文件是用来自动生成版本号的模板文件，它不应该被编译，所以我们要把它的Build Action改成None，如下图所示：</p>
<img src="http://www.cppblog.com/images/vckbase_com/localvar/1234/o_image003.jpg">
<h4>4.&nbsp;修改AssemblyInfo.template.cs的内容</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;在这个文件中，你能找到如下两行代码： <br><font color=#0000ff>[assembly: AssemblyVersion( "1.0.0.0" )] <br>[assembly: AssemblyFileVersion( "1.0.0.0" )] <br></font>其中的&#8220;1.0.0.0&#8221;就是程序的版本号，它使用的是&#8220;主版本号.次版本号.内部版本号.修订号&#8221;的形式。前三个改成你自己需要的数字，最后一个改成&#8220;$WCREV$&#8221;，改完之后应该是类似下面的样子： <br><font color=#0000ff>[assembly: AssemblyVersion( "1.0.0.$WCREV$" )] <br>[assembly: AssemblyFileVersion( "1.0.0.$WCREV$" )]</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;在这个文件的最后，你还应该加上下面两段代码，它们可以检测出有本地修改（修改了但没有提交）的代码和有混合版本的代码。 <br><font color=#0000ff>#if $WCMIXED?true:false$ <br>#if DEBUG <br>#warning mixed update revisions founded <br>#else <br>#error mixed update revisions founded <br>#endif <br>#endif <br><br>#if $WCMODS?true:false$ <br>#if DEBUG <br>#warning local modification founded <br>#else <br>#error local modification founded <br>#endif <br>#endif</font></p>
<h4>5.&nbsp;修改项目属性</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;在项目属性的Build Event页的Pre-build event command line中输入： <br><font color=#0000ff>"%ProgramFiles%\TortoiseSVN\bin\SubWCRev.exe" $(SolutionDir) $(ProjectDir)Properties\AssemblyInfo.template.cs $(ProjectDir)Properties\AssemblyInfo.cs -f <br></font>注意，这里我们必须保证TortoiseSVN安装到了默认路径上。在多人参加的项目中这应该是强制性的要求，否则，大家安装的路径都不一样，甲机器上能用的配置，到了乙机器上可能就不行了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;然后，你可能还需要将Publish页中的Automatically increment revision with each publish选项关掉（我不确定这步是否必须）。C#可以自己递增版本号，但它生成的版本号和代码库中的代码没有对应关系，我个人觉得意义不大。并且它还可能会把我们的版本自增机制搞乱。所以应该关掉。</p>
<h4>6.&nbsp;把项目加入版本库</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;使用VisualSVN的Add solution to Subversion命令把项目加入SVN，但不要提交。</p>
<h4>7.&nbsp;从SVN中排除AssemblyInfo.cs文件</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;每次编译时，这个文件都会基于AssemblyInfo.template.cs重新生成，所以没必要加入版本库。这步做完之后就可以提交整个项目了。</p>
<img src="http://www.cppblog.com/images/vckbase_com/localvar/1234/o_image004.jpg">
<h4>8.&nbsp;编译</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;编译完成后，看一下生成的autover.exe文件的版本信息，本例中是1.0.0.1。随便改点什么，提交，重新编译，你会发现它自动变成了1.0.0.2，也就是程序的修订号总是与生成它的代码的修订号一致。这样，当程序出问题后，我们通过这个数字就能轻松得到生成它的那一版代码了。</p>
<img src="http://www.cppblog.com/images/vckbase_com/localvar/1234/o_image005.jpg">
<h4>9.&nbsp;其它问题</h4>
<p>&nbsp;&nbsp;&nbsp;&nbsp;第8步中大家做完修改后再编译时可能会看到警告或错误信息，说代码有本地修改或混合版本。这就是第4步中，在AssemblyInfo.template.cs文件最后加的两段代码的作用，它们检测代码是否都已经提交了并且版本是否一致，一旦发现问题就会在调试版中生成警告信息，在发布版中生成错误信息。使用这种方法，我们可以基本消除发布的程序的版本和代码的版本出现不一致的可能性。去掉这两个错误或警告的方法也很简单，把代码整体提交或更新一下就行了。</p>
<img src="http://blog.vckbase.com/localvar/aggbug/33718.html" width=1 height=1> 
<img src ="http://www.cppblog.com/localvar/aggbug/132755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/localvar/" target="_blank">局部变量</a> 2008-05-20 09:12 <a href="http://www.cppblog.com/localvar/archive/2008/05/20/132755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下配置SVN 1.4.5 + APACHE 2.2.6使用域认证</title><link>http://www.cppblog.com/localvar/archive/2007/12/20/132760.html</link><dc:creator>局部变量</dc:creator><author>局部变量</author><pubDate>Thu, 20 Dec 2007 06:28:00 GMT</pubDate><guid>http://www.cppblog.com/localvar/archive/2007/12/20/132760.html</guid><wfw:comment>http://www.cppblog.com/localvar/comments/132760.html</wfw:comment><comments>http://www.cppblog.com/localvar/archive/2007/12/20/132760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/localvar/comments/commentRss/132760.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/localvar/services/trackbacks/132760.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp; 其实在网上搜索这个主题，已经有很多文章了，而且Subversion和TortoiseSVN的文档上也有相关介绍。但在我自己配置的过程中，发现它们好像都不完全对。所以我觉得有必要把自己摸索的过程写出来，供大家参考。不过已经有那么多&#8220;前车之鉴&#8221;了，我的方法是否真的有用，只能靠老天保佑了。<br>&nbsp;&nbsp;&nbsp; 要想配置成功，首先要保证Apache、Svn和mod_auth_sspi这几个模块的版本是匹配的。我最开始就是在这上面栽的跟头。Apache有很多个版本（以2.0.x和2.2.x最常见），作为对应，每个版本的svn都有一些子版本与其匹配。例如1.4.5版的svn就有针对2.0.x和2.2.x的两个子版本。不幸的是，网上搜到的svn下载链接多是指向针对Apache 2.0.x的那个子版本，当把它用在最新版（目前是2.2.6）的Apache上时，出问题就是必然的了。实际上，当使用2.2.x版的Apache时，我们应该到<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?expandFolder=91&amp;folderID=9246" target=_blank>这里</a>，点击左侧的文件夹<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&amp;expandFolder=8100&amp;folderID=9246" target=_blank>Windows Apache 2.2.x</a>（等以后有了新版的apache，可能就是其它对应的文件夹了），然后在右侧的文件列表中下载对应得svn（我下载的是<a href="http://subversion.tigris.org/downloads/1.4.5-win32/apache-2.2/svn-win32-1.4.5.zip" target=_blank>svn-win32-1.4.5.zip</a>）。mod_auth_sspi我们也下载针对2.2.x版apache的那个就可以了。<br>&nbsp;&nbsp;&nbsp; 以下是我的安装配置过程，它是针对apache2.2.6和svn1.4.5的，如果你用的是其它版本，可能一些细节上会有所不同。<br>&nbsp;&nbsp;&nbsp; 分别安装apache和svn（svn就是把压缩包解开就行），然后把svn\bin文件夹下的mod_dav_svn.so、mod_authz_svn.so、libdb44.dll和intl3_svn.dll拷贝到apache的modules文件夹下，mod_auth_sspi中的mod_auth_sspi.so也拷贝到那去。<br>&nbsp;&nbsp;&nbsp; 最后是修改apache的配置文件httpd.conf，经过我的试验，最后确定使用下面配置文件就行了（其中背景标红的内容你可能需要根据你的实际情况进行修改）。</div>
<table style="BORDER-COLLAPSE: collapse" border=1 cellSpacing=0 borderColor=#999999 cellPadding=0 width="75%" bgColor=#f1f1f1>
    <tbody>
        <tr>
            <td>
            <p style="LINE-HEIGHT: 150%; MARGIN: 5px"><code><span style="COLOR: #000000"><span style="COLOR: #0000ff">ThreadsPerChild</span> 250<br><span style="COLOR: #0000ff">MaxRequestsPerChild</span> 0<br><br><span style="COLOR: #0000ff">ServerRoot</span> <span style="COLOR: #ff00ff">"<font style="BACKGROUND-COLOR: #ff0000" color=#000000>C:/Program Files/Apache Software Foundation/Apache2.2</font>"</span><br><span style="COLOR: #0000ff">ServerName</span> <font style="BACKGROUND-COLOR: #ff0000">svnserver.mydomain.net<span style="COLOR: #0000cc">:</span>8080</font><br><span style="COLOR: #0000ff">ServerSignature</span> <span style="COLOR: #ff0000">Off</span><br><span style="COLOR: #0000ff">ServerTokens</span> Prod<br><span style="COLOR: #0000ff">DocumentRoot</span> <span style="COLOR: #ff00ff">"htdocs"</span><br><span style="COLOR: #0000ff">Listen</span> <font style="BACKGROUND-COLOR: #ff0000">8080</font><br><br><span style="COLOR: #0000ff">LoadModule</span> sspi_auth_module modules/mod_auth_sspi.so<br>#<span style="COLOR: #0000ff">LoadModule</span> auth_basic_module modules/mod_auth_basic.so<br>#<span style="COLOR: #0000ff">LoadModule</span> auth_digest_module modules/mod_auth_digest.so<br>#<span style="COLOR: #0000ff">LoadModule</span> authn_file_module modules/mod_authn_file.so<br><span style="COLOR: #0000ff">LoadModule</span> authz_svn_module modules/mod_authz_svn.so<br><span style="COLOR: #0000ff">LoadModule</span> dir_module modules/mod_dir.so<br><span style="COLOR: #0000ff">LoadModule</span> deflate_module modules/mod_deflate.so<br><span style="COLOR: #0000ff">LoadModule</span> mime_module modules/mod_mime.so<br><span style="COLOR: #0000ff">LoadModule</span> setenvif_module modules/mod_setenvif.so<br><span style="COLOR: #0000ff">LoadModule</span> dav_module modules/mod_dav.so<br><span style="COLOR: #0000ff">LoadModule</span> dav_svn_module modules/mod_dav_svn.so<br><br><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000ff">Directory</span> /<span style="COLOR: #0000cc">&gt;</span><br>&nbsp;&nbsp;<span style="COLOR: #0000ff">Options</span> <span style="COLOR: #ff0000">FollowSymLinks</span><br>&nbsp;&nbsp;<span style="COLOR: #0000ff">AllowOverride</span> <span style="COLOR: #ff0000">None</span><br><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000ff">Directory</span><span style="COLOR: #0000cc">&gt;</span><br><br><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000ff">IfModule</span> dir_module<span style="COLOR: #0000cc">&gt;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">DirectoryIndex</span> index.html<br><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000ff">IfModule</span><span style="COLOR: #0000cc">&gt;</span><br><br><span style="COLOR: #0000ff">ErrorLog</span> <span style="COLOR: #ff00ff">"<font style="BACKGROUND-COLOR: #ff0000" color=#000000>e:/svn/server.log</font>"</span><br><span style="COLOR: #0000ff">LogLevel</span> <span style="COLOR: #ff0000">error</span><br><br><span style="COLOR: #0000ff">DefaultType</span> text/plain<br><br><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000ff">IfModule</span> mime_module<span style="COLOR: #0000cc">&gt;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">TypesConfig</span> conf/mime.types<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">AddType</span> application/x-compress .Z<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">AddType</span> application/x-gzip .gz .tgz<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">AddType</span> application/x-x509-<span style="COLOR: #ff0000">ca</span><span style="COLOR: #ff0000">-</span>cert .crt<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">AddType</span> application/x-pkcs7-crl .crl<br><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000ff">IfModule</span><span style="COLOR: #0000cc">&gt;</span><br><br><span style="COLOR: #0000cc"><font color=#000000># 注意&#8220;/svn/&#8221;中最后的斜杠是必须的, 否则列不出版本库列表<br># 访问时的url也要带着它, 想要去掉它可搜索RedirectMatch</font><br>&lt;</span><span style="COLOR: #0000ff">Location</span> <font style="BACKGROUND-COLOR: #ff0000">/svn/</font><span style="COLOR: #0000cc">&gt;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;# configure SVN<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">DAV</span> svn<br>&nbsp;&nbsp;&nbsp;&nbsp;SVNListParentPath <span style="COLOR: #ff0000">on</span><br>&nbsp;&nbsp;&nbsp;&nbsp;# 版本库的根目录<br>&nbsp;&nbsp;&nbsp;&nbsp;SVNParentPath <font style="BACKGROUND-COLOR: #ff0000">e<span style="COLOR: #0000cc">:</span><span style="COLOR: #0000cc">/</span>svn</font><br>&nbsp;&nbsp;&nbsp;&nbsp;# 权限控制文件<br>&nbsp;&nbsp;&nbsp;&nbsp;AuthzSVNAccessFile <font style="BACKGROUND-COLOR: #ff0000">e<span style="COLOR: #0000cc">:</span><span style="COLOR: #0000cc">/</span>svn/authz</font><br>&nbsp;&nbsp;&nbsp;&nbsp;# 认证时的提示信息(中文不好使)<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">AuthName</span> <span style="COLOR: #ff00ff">"<font style="BACKGROUND-COLOR: #ff0000" color=#000000>My Subversion</font>"</span><br>&nbsp;&nbsp;&nbsp;&nbsp;# 使用域认证<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">AuthType</span> SSPI<br>&nbsp;&nbsp;&nbsp;&nbsp;SSPIAuth <span style="COLOR: #ff0000">On</span><br>&nbsp;&nbsp;&nbsp;&nbsp;SSPIAuthoritative <span style="COLOR: #ff0000">On</span><br>&nbsp;&nbsp;&nbsp;&nbsp;# 指定使用那个域<br>&nbsp;&nbsp;&nbsp;&nbsp;SSPIDomain <font style="BACKGROUND-COLOR: #ff0000">mydomain.net</font><br>&nbsp;&nbsp;&nbsp;&nbsp;# 是否省略掉用户id的域名部分(好像只是影响svn的一些日志记录)<br>&nbsp;&nbsp;&nbsp;&nbsp;SSPIOmitDomain <span style="COLOR: #ff0000">On</span><br>&nbsp;&nbsp;&nbsp;&nbsp;# 是否允许非IE客户端(必须打开)<br>&nbsp;&nbsp;&nbsp;&nbsp;SSPIOfferBasic <span style="COLOR: #ff0000">On</span><br>&nbsp;&nbsp;&nbsp;&nbsp;# 基本认证(非域认证方式)具有更高的优先级?<br>&nbsp;&nbsp;&nbsp;&nbsp;SSPIBasicPreferred <span style="COLOR: #ff0000">Off</span><br>&nbsp;&nbsp;&nbsp;&nbsp;# 用户名大小写<br>&nbsp;&nbsp;&nbsp;&nbsp;SSPIUsernameCase lower<br>&nbsp;&nbsp;&nbsp;&nbsp;# 用户必须通过认证<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">Require</span> valid-<span style="COLOR: #0000ff">user</span><br><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000ff">Location</span><span style="COLOR: #0000cc">&gt;</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp; 最后如果大家觉得手工编辑那个权限控制文件（authz）很麻烦的话，也有一个取巧的办法，就是使用visualsvn server，虽然它目前还不支持域认证，但是我们可以借用它的权限管理界面。操作如下（假设版本库的根目录是e:\svn，并且权限控制文件的名字这时必须用authz）：<br>1）&nbsp;按前面的操作安装好apache和svn，但不要启动apache<br>2）&nbsp;把e:\svn改名为e:\svn1<br>3）&nbsp;<a href="http://www.visualsvn.com/server" target=_blank>下载</a>并安装visualsvn server，安装时指定版本库根目录为e:\svn<br>4）&nbsp;停掉并禁用visualsvn server的服务（VisualSVNServer），删除e:\svn<br>5）&nbsp;把e:\svn1的名字改回e:\svn<br>6）&nbsp;启动apache<br>7）&nbsp;启动visualsvn server的管理界面，把要使用这个版本库的所有人的域帐号都添加到它的用户列表中去（密码不会被实际使用，随便设或留空都行）。<br>8）&nbsp;万事ok了，设置权限吧！<br>
<div><br>ps: 2008-05-23<br>tortoisesvn(1.4.8版)文档中关于使用多认证源的描述中有一个错误，其中的<font color=#ff0000>AuthAthoritative</font><font color=#000000>和</font><font color=#ff0000>AuthAuthoritative<font color=#000000>都应该改成</font><font color=#ff0000>AuthBasicAuthoritative</font></font><font color=#000000>。另外，多认证源还要求域用户登录时必须用&#8220;domain\user&#8221;的形式，只输user部分就会用其他认证方式。所以，如果你按我前面的描述用了visual svn server，增加多认证源后，域用户的密码就千万不要留空了，因为那样不用密码就能登录了。<br></font></div>
<img src="http://blog.vckbase.com/localvar/aggbug/31427.html" width=1 height=1> 
<img src ="http://www.cppblog.com/localvar/aggbug/132760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/localvar/" target="_blank">局部变量</a> 2007-12-20 14:28 <a href="http://www.cppblog.com/localvar/archive/2007/12/20/132760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍一下Subversion</title><link>http://www.cppblog.com/localvar/archive/2007/12/18/132761.html</link><dc:creator>局部变量</dc:creator><author>局部变量</author><pubDate>Tue, 18 Dec 2007 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/localvar/archive/2007/12/18/132761.html</guid><wfw:comment>http://www.cppblog.com/localvar/comments/132761.html</wfw:comment><comments>http://www.cppblog.com/localvar/archive/2007/12/18/132761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/localvar/comments/commentRss/132761.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/localvar/services/trackbacks/132761.html</trackback:ping><description><![CDATA[<div align=left>本来是发在公司内刊上的，现在拿来这里凑个数。</div>
<div align=left>&nbsp;</div>
<div align=left>&nbsp;&nbsp;&nbsp; 前一段时间，公司讨论统一配置管理工具时，我推荐了svn（subversion）。照理说，在公司已经使用了vss、cvs和ClearCase三种工具的情况下，再提一种基本没人用过的新工具不是什么明智的选择。但我确实觉得svn的优点很突出，值得一荐。下面我就对svn进行一下简单介绍，让各位同事对其有一个初步的了解。</div>
<h4>1.&nbsp;与其他工具的对比</h4>
<div>&nbsp;&nbsp;&nbsp; vss是我用的最多的配置工具，所以我相信每个用过vss的人都会对它的离线操作功能头疼不已。虽然它允许在与服务器断开的情况下修改文件，但重新连接后必须非常小心的处理每个文件，一旦出错，就会造成不小的麻烦。svn则没有这个问题。二者更详细的区别我会在下一节说明，这里就不多啰嗦了。<br>&nbsp;&nbsp;&nbsp; svn相对cvs是有明显优势的，因为svn的设计目标之一就是&#8220;一个更好的cvs&#8221;。而且，从众多开源项目的反映看，它也确实达到了这个目标：06年，最大的开源网站SourceForge开始支持svn；KDE和GNOME的开发团队也已经换用svn；如果大家多注意一下的话，还会发现更多著名的开源项目使用了svn。<br>&nbsp;&nbsp;&nbsp; ClearCase我没有实际使用过，按说应该无权评价。不过，我没有用过它的原因是因为它太难用了，曾经学过几天，但后来觉得太过复杂，就转向vss了。相比之下，svn是比较简单的，我大概花了一两天的时间就可以完成基本操作了，用的比较熟练也不过两周。另外就是ClearCase要钱，而svn是免费的。<br>&nbsp;&nbsp;&nbsp; 下表是这几种工具的对比，列出的功能都是我比较关心的。更详细的比较，大家可以看看<a href="http://better-scm.berlios.de/comparison/">http://better-scm.berlios.de/comparison/</a>。</div>
<div>
<table border=1 cellSpacing=1 cellPadding=1 width="75%">
    <tbody>
        <tr>
            <td>
            <p align=center><strong>项目</strong></p>
            </td>
            <td>
            <p align=center><strong>Vss</strong></p>
            </td>
            <td>
            <p align=center><strong>Clearcase</strong></p>
            </td>
            <td>
            <p align=center><strong>Cvs</strong></p>
            </td>
            <td>
            <p align=center><strong>svn</strong></p>
            </td>
        </tr>
        <tr>
            <td>&nbsp;文件/目录的重命名或移动</td>
            <td>
            <p align=center>是?</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
            <td>
            <p align=center>否</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;原子提交</p>
            </td>
            <td>
            <p align=center>否</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
            <td>
            <p align=center>否</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;变更集</p>
            </td>
            <td>
            <p align=center>否</p>
            </td>
            <td>
            <p align=center>可间接实现</p>
            </td>
            <td>
            <p align=center>否</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;中文支持</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
            <td>
            <p align=center>未知</p>
            </td>
            <td>
            <p align=center>差</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;visual studio集成</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;eclipse集成</p>
            </td>
            <td>
            <p align=center>未知</p>
            </td>
            <td>
            <p align=center>未知</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;http访问</p>
            </td>
            <td>
            <p align=center>8.0支持</p>
            </td>
            <td>
            <p align=center>差</p>
            </td>
            <td>
            <p align=center>是&nbsp;</p>
            </td>
            <td>
            <p align=center>是&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;离线操作</p>
            </td>
            <td>
            <p align=center>差</p>
            </td>
            <td>
            <p align=center>未知&nbsp;</p>
            </td>
            <td>
            <p align=center>是&nbsp;</p>
            </td>
            <td>
            <p align=center>是&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;权限管理</p>
            </td>
            <td>
            <p align=center>是</p>
            </td>
            <td>
            <p align=center>是&nbsp;</p>
            </td>
            <td>
            <p align=center>较差&nbsp;</p>
            </td>
            <td>
            <p align=center>是&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;易用性</p>
            </td>
            <td>
            <p align=center>简单</p>
            </td>
            <td>
            <p align=center>复杂</p>
            </td>
            <td>
            <p align=center>较简单</p>
            </td>
            <td>
            <p align=center>较简单</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=left>&nbsp;授权</p>
            </td>
            <td>
            <p align=center>商业</p>
            </td>
            <td>
            <p align=center>商业&nbsp;</p>
            </td>
            <td>
            <p align=center>GPL&nbsp;</p>
            </td>
            <td>
            <p align=center>Apache/BSD&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<h4>2.&nbsp;svn能解决哪些问题</h4>
<div>&nbsp;&nbsp;&nbsp; 一直以来，XXXX项目都是使用vss作为配置管理工具的，但应用过程中我也越来越感觉到vss满足不了项目的需要，所以决定在项目组内试用svn，并在合适的时机完全转换到svn。具体说来，svn可以解决以下几个（包括但不限于<img border=0 src="http://www.cppblog.com/Emoticons/QQ/smile.gif" width=20 height=20>）问题。</div>
<h5>2.1.&nbsp;获取某个以前的版本</h5>
<div>&nbsp;&nbsp;&nbsp; 我想获得三天前签入的某个版本怎么办？在vss中，如果没有打标签，那可能就只有一个文件一个文件的去找了。规定每次签入都打个标签或许是个解决办法，不过这项规定能否很好的执行就是另一个问题了。在svn中，每次签入（准确地说应该是&#8220;提交&#8221;）都会为整个代码库生成一个确定的版本，所以能够轻松完成此任务。</div>
<h5>2.2.&nbsp;自动递增版本号</h5>
<div>&nbsp;&nbsp;&nbsp; XXXX发布后，现场经常会反馈回来一些问题。但我发现这些问题中有不少是由于程序版本不匹配或没有用最新的程序造成的。所以我就想在编译过程中实现一个自增版本号的功能，每次修改后，能自动生成一个版本号，并且能把它显示在程序的关于对话框等位置，这样工程人员就能直接把这些原因造成的问题排除掉了。让我失望的是vss做不到这一点，虽然它有&#8220;关键字扩展（keyword expansion）&#8221;功能，但实现不了我的需求。而如果要求每次编译前手工修改版本号，就是另外一个能否切实执行的问题，我对这类问题的总是很悲观的。<br>&nbsp;&nbsp;&nbsp; 前面已经说过，在svn中，每次签入（提交）都会为整个代码库生产一个版本。生成它的同时，svn还会为其指定一个递增的修订号，利用这个修订号和一个配套的工具（SubWCRev)，就可以做到自动生成版本号了。</div>
<h5>2.3.&nbsp;变更集</h5>
<div>&nbsp;&nbsp;&nbsp; 作为项目经理或设计人员，大家可能还会经常希望知道某个开发人员的某次签入到底修改了哪些内容，这一点在vss中也是做不到的。而在svn中，只要比较签入前的版本和签入后的版本就行了。实际上，在svn中，你可以比较任意两个版本之间的区别，甚至能追查到一个文件中每行代码的责任人。</div>
<h5>2.4.&nbsp;离线操作</h5>
<div>&nbsp;&nbsp;&nbsp; 这个在前面已经说过了，再提一次是想强调一下我有多希望配置管理工具支持此功能。</div>
<h3>3.&nbsp;相关工具和网站</h3>
<div><strong>TortoiseSvn：</strong>是windows下功能最强、最实用的svn客户端。它与资源管理器的右键菜单集成，可以管理包括源代码在内的任何文件。它的&#8220;图标叠加（Icon Overlay）&#8221;功能，可以让我们从文件和文件夹的图标中直观的看出它们的状态，如是否被修改等。另外，前面提到的SubWCRev就是它的一部分。<br><strong>AnkhSvn：</strong>一个visual studio的svn插件，支持svn的大部分功能，并且比较好用。<br><strong>VisualSvn：</strong>也是一个visual studio的svn插件，应该比AnkhSvn好一些，不过它是商业软件。</div>
<div><strong>VisualSvn Server：</strong>windows下svn+apache的组合，提供了一个mmc的管理界面，喜欢gui界面的人的福音。而且，虽然它和VisualSvn是同一家公司的产品，但它是免费的。<br><strong>Subclipse：</strong>eclipse的svn插件，也已经很成熟，据说使用风格和eclipse自带的cvs插件非常像。<br><strong>p4merge：</strong>这是一个文件对比/合并工具，TortoiseSvn自带的文件比较工具还比较好用，但合并工具就差点了，起码没有vss的好用。能找到的工具大多只支持双视图合并。p4merge则能支持三视图甚至四视图，用起来方便很多。开发这个工具的公司也是做配置管理软件的，不过这个公司比较好，只对它的服务器端收费，其他工具都可以免费用。<br><a href="http://www.tigris.org/"><strong>http://www.tigris.org/</strong></a><strong>：</strong>这是subversion、TortoiseSvn、AnkhSvn以及其它众多开源软件开发管理工具的官方站点。<br><a href="http://www.subversion.org.cn/"><strong>http://www.subversion.org.cn/</strong></a><strong>：</strong>svn中文网站。<br><a href="http://www.iusesvn.com/"><strong>http://www.iusesvn.com/</strong></a><strong>：</strong>也是一个svn的中文网站，内容和上一个有很多是重复的。<br></div>
<div></div>
<img src="http://blog.vckbase.com/localvar/aggbug/31344.html" width=1 height=1> 
<img src ="http://www.cppblog.com/localvar/aggbug/132761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/localvar/" target="_blank">局部变量</a> 2007-12-18 10:42 <a href="http://www.cppblog.com/localvar/archive/2007/12/18/132761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>