引言:一直以來我都認為,MS應該從開源項目中汲取有益的東西,開源項目也要向MS學習,而不是象網上每次提到.Net和Java就要打嘴仗一樣,有些文人相輕的意思。^……^我從工作以來很有幸的能夠參與多個Java和.Net項目開發,時常在這兩種技術之間比較思考,現在有機會和大家分享,說的不對的地方,請大家多多指教。首先我準備談談SCM,個人認為在現在的大型軟體開發中,團隊合作是項目成功最重要的因素之一,尤其是使用.Net和Java這些強大的物件導向的語言開發程式,必然會多次分層,基於組件的共用等等,所以SCM就更重要了。MS的VSS我想大家應該都用過,也知道VSS的優劣,我就不多說了。(風傳VSS不是MS自己開發的,記得有次我去過真正開發VSS的公司的網站,現在地址也忘記了。並且MS內部也不會使用VSS作為自己的SCM工具,呵呵,不知道是不是真的?)在以後的系列文章裡,我會講解Subversion,CVS這些主流的開源項目SCM工具,並且會延伸到CI(Continues Integration,即繼續整合)和BugTrace領域,畢竟只有版本控制系統對於一個大型軟體的開發是遠遠不夠的。在這個旅程中,我還會帶大家領略一下python(我的最愛。。。呵呵,不想試試嗎?非常強大!)的旖旎風光,而且這一系列文章也會收錄在我準備撰寫的《Using Open Source Software to Implement Your .Net Applications》(中英雙語版,呵呵。。。考察一下自己的英語)。首先來介紹一下Subversion,以下引自賽迪網-開放系統世界,作者:顧宏軍
長久以來,在開源世界中,CVS(Concurrent Versions System)一直都是版本控制的首選。但是現在使用者有了另一個選擇,就是Subversion。Subversion是下一代版本控制系統,能替代CVS,項目首頁是http://subversion.tigris.org。
Subversion是一個自由、開放源碼的版本控制系統。它是一個通用系統,可用來管理任何類型的檔案, 其中包括程式源碼。
它的初始目標很明確,實現絕大部分CVS的已有功能;充分考慮現有的CVS使用者,在使用方式上模仿CVS,同時開發了一系列工具,使得基於CVS的項目能夠順利遷移到Subversion上。和CVS相比,它有很多優點,例如目錄版本控制、不可分割的提交、一致的資料處理方式和更有效率的分支與標記等。。。
如果你使用過CVS就能體會到上文所說的Subversion好處了,比如目錄版本控制,目錄的改名等。對於Subversion的原子提交,我想多說幾句,大家可以想象,我們一般做一個修改,可能需要改動多個檔案,尤其現在大家多對分層已經趨之若鶩了,除非你還在用著哪種什麼東西都寫在一起的語言。(比如PB?呵呵,感覺好像是這樣的東西。我現在正在作一個遺留系統的遷移到.Net上的工作,這個系統就是用類似PB的一種指令碼語言Panther,ui,邏輯和資料訪問全在一個檔案裡面,我在代碼裡面還看到了80年代的注釋。呵呵,很強吧?我們公司幾個程式員可能是中國為數不多的懂panther語言的人了。扯遠了。。。)如果你的一次提交過程中,由於網路原因或者機器的硬體原因或者根本是你自己落下了一些檔案沒提交,在邏輯意義上這次提交是不完整的,Subversion的原子提交能很好的解決這個問題,個人認為這也是對於CVS最大的改進了。怎麼樣,是不是有些想資料庫的事務的概念呢?動心了吧?ok,廢話少說,let's go!(Follow me! Fire in the hole!^……^)
Subversion有兩種運行方式,一種是基於Apache Http Server,另外一種是Subversion Standalone Server。下面我講解的是基於Apache Http Server的Subversion,這樣做幾個好處:A.能使用WebDAV協議。B.能使用瀏覽器作為用戶端工具瀏覽源碼倉庫。C.可以很容易的支援到SSPI(Windows域認證)和LDAP(AD?),這些都是Apache本身就支援的。D.能得到比較完善的Apache安全認證系統,比如SSL加密串連。
在正式安裝配置Subversion之前我們先來作點準備工作,由於我們以後會經常在命令列下執行命令,每次開啟一個新的命令列視窗預設的目前的目錄都是C:\Documents and Settings\$UserName,這樣在執行命令之前都要切換目錄,很麻煩,所以我們先來解決這個問題。在“開始”-“運行”中輸入“regedit”,開啟註冊表。找到\HKEY_CLASSES_ROOT\Folder\shell,如果沒有shell,可以在Folder下建立一個名為shell的鍵,在shell下建立一個名為“命令列(Command Windows)”的鍵,在這個鍵之下再建一個新的名為“Command”的鍵,設定預設值為“cmd /K cd /d %L”。
完成後的效果如下:
這樣當我們選中一個目錄,在右鍵操作功能表裡面就多了一個“命令列(Command Windows)”的選項,單擊這個選項就可以開啟一個命令列視窗並且快速切換到當前選中的目錄。說些題外話,很多人提到MS就義憤填膺,可是有多少人真正掌握MS的技術呢?比如這個小小的CMD命令,建議大家在命令列視窗中輸入“cmd /?”,相信收穫不少。前段時間在看候捷先生的《Word的排版藝術》,china-pub上很多留的書評都是不屑一顧,我不知道這些人是不是真的能把WinWord作為自己的“寫作平台”?以前我都是用DockBook作為寫作的工具,現在才知道Word可以這樣用,MS也不是一無是處呀。。。
注意:如果你使用WinXP作為Subversion伺服器,請打上SP1補丁,否則會導致錯誤的網路資料轉送使Subversion的資料庫不能正常使用。(我自己的Notebook是WinXP SP2,工作良好,至於Win2K沒有測試,我想應該不會有什麼問題吧?)
安裝Subversion:
1.到www.apache.org上下載apache http server,注意要下載2.0.X以上的版,否則不能和當前最新的Subversion工作。
2.到http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91上下載Subversion當前1.1.3版本的二進位安裝檔案,一般tigris.org並不提供二進位包,這些二進位包是有一些志願者維護的,所以可能不是當前最新的版本。如果你想嘗鮮使用Subversion的最新版,請下載源碼自己編譯。
3.安裝apache http server
4.安裝Subversion
5.檢查$\apache group\apache2\modules下是不是已經有了mod_dav_svn.so和mod_authz_svn.so
6.檢查$\apache group\apache2\modules下是不是已經有了libdb42.dll,
7.搜尋$\apache group\apache2\conf\httpd.conf設定檔中的#LoadModule dav_fs_module modules/mod_dav_fs.so,把前面的注釋#去掉;並檢查LoadModule配置節的末尾是不是有了LoadModule dav_svn_module modules/mod_dav_svn.so和LoadModule authz_svn_module modules/mod_authz_svn.so,
注意,請先安裝Apache,然後再安裝Subversion,這樣上述5,6,7步驟都可以免了,在安裝Subversion過程中它會自動拷貝相應檔案到相應目錄中,並且修改http.conf檔案,然後重新啟動apache服務使修改生效。但是我發現現在這個版本的Subversion安裝檔案可能有個bug,apache的http.conf的設定檔中#LoadModule dav_fs_module modules/mod_dav_fs.so注釋沒有去掉,所以大家還是小心檢查一下。如果你是先安裝的Subversion,然後再安裝的Apache的,那麼上述的步驟一個也不能漏,都需要自己手動完成。
配置Subversion:
1.在硬碟上建立源碼庫的根目錄,例如E:\SVN
2.在E:\SVN之下建立一個新的目錄,例如TestRepository作為我們的測試源碼庫
3.建立Subversion資料庫,目前的版本Subversion支援兩種格式資料庫,一種是FSFS,另外一種是BDB( Berkeley Database)。在命令列下輸入svnadmin create --fs-type bdb TestRepository建立BDB格式的資料庫(確保目前的目錄已經切換到E:\SVN\),在命令列下輸入svnadmin create --fs-type fsfs TestRepository建立FSFS格式的資料庫(確保目前的目錄已經切換到E:\SVN\)。建好資料庫以後,到E:\SVN\TestRepository下看看是不是多了很多目錄和檔案,可以研究一下這些檔案,對理解Subversion有協助,但是不要試圖直接修改這些檔案!
如果大家經常關注開源技術,就知道BDB是一個輕量級的關聯式資料庫,可以作為一個輕巧的內建資料庫,在很多開源項目下有很多應用,比如CVSTrac。FSFS格式主要的特點是可以支援Subversion的資料庫和Subversion伺服器可以在不同的物理機器上,可以通過網際網路共用(不知道是否支援NFS?),能很好的工作在MS Win98上,並且速度更快,但是由於FSFS是一種新的格式,穩定性可能沒有BDB好。推薦大家使用BDB,畢竟BDB有很多年開發曆史,比較穩定,而且我覺得把Subversion的DB和伺服器分開放置好像沒有什麼必要吧?(誰能告訴我這樣做的好處?),大家也不會拿一台Win98作server吧?^……^。不要試圖在BDB的格式的資料庫上使用網際網路共用,也不要使用網路磁碟映射,否則會導致無法預料的錯誤。
4.開啟$\apache group\apache2\conf\httpd.conf設定檔,在檔案的末尾加入以下語句,
<Location /svn>
DAV svn
SVNParentPath e:\SVN
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile passwd
#AuthzSVNAccessFile svnaccessfile
Require valid-user
</Location>
這裡建立了一個虛擬目錄http://yourServer/svn/,所有的Subversion源碼倉庫都在這個虛擬目錄中,並且使用“passwd”檔案中username/password(使用者名稱/密碼)列表訪問http://yourServer/svn/。關於Subversion的安全配置是一個比較重要的部分,我會留到下次配置SSL加密串連再講。
5.在命令列下切換到$\apache group\apache2,執行bin\htpasswd -c passwd <username>,這裡<username>是你想要加入的使用者名稱,比如doudou。執行這個命令成功以後就會在bin目錄下建立一個passwd檔案,之後如果再加入新的使用者和更改已有使用者的密碼,執行bin\htpasswd passwd <username>即可。
注意一定要在$\apache group\apache2下執行,這樣產生的passwd檔案$\apache group\apache2根目錄下,而不是在bin目錄下,apache預設是在$\apache group\apache2根目錄下尋找passwd檔案,如果你在bin目錄下執行了這個命令請把產生的passwd檔案剪下到$\apache group\apache2根目錄下。這一點也可以從Apache的log日誌中看得出來,
6.重啟Apache服務
7.在瀏覽器地址欄中輸入 http://YourServer/svn/TestRepository,輸入使用者名稱密碼,ok。Subversion現在已經可以正常工作了。
在寫作本文的時候參考了TortoiseSVN的協助文檔,在此感謝TortoiseSVN團隊傑出的工作!