劉軍華,尹 根
(湖南郵電職業技術學院,湖南長沙410015)
軟件項目的開發通常是由多人協作分工完成的,在此過程中每個項目參與人都會創建大量的源代碼和文檔。如何在不使用SVN 服務端(VisualSVNServer)的情況下,對由多人共同編寫的源代碼和文檔進行有效地管理和維護成了困擾開發者的一大難題。比如,在高職院校技能競賽的移動互聯網應用軟件開發、Web 應用軟件開發、物聯網技術應用等多個賽項中,就會涉及到要將多個選手編寫的項目代碼快速整合到一起的工作,讓許多參賽選手感到有些棘手[1]。本文以TortoiseSVN 免費開源的版本控制軟件為例,提出了在Android Studio 開發工具實現項目版本控制的參考方法。
SVN 是Subversion 的縮寫,是一個免費開源的版本控制軟件[2]。TortoiseSVN 是SVN 版本控制軟件的一個開源客戶端,可以超越時間進行文件和目錄管理。文件保存在中央版本庫,版本庫就像一個文件服務器,除了能記住文件和目錄的每次修改,還可以通過檢查歷史知道數據作了哪些修改以及是誰做的修改,且將文件恢復到過去的版本,因此也被稱為“時間機器”[3]。
版本庫(Repository):也稱代碼庫,存儲庫,中央版本庫,是源代碼統一存放的地方。它采用分層“文件——目錄”文件樹形式來存儲數據,版本庫中存儲了項目的所有數據,如項目源代碼和文檔等。每一個項目都是版本庫的子目錄,庫中記錄了每個用戶的每一次修改。連接到版本庫的用戶都能讀寫這些數據,都能從版本庫中提取項目或提交項目到版本庫中去[4]。
工作拷貝(Working copy):也稱工作副本。與中央版本庫相對應的,它是開發者在本地機器上的一個文件目錄,里面存放著從版本庫中獲得的源代碼和文檔的一個副本,開發者可以在本地查看、修改、編譯、運行和調試,完成后再把新版本的源代碼和文檔提交到中央版本庫。
提?。–heckout):也稱簽出。從版本庫中獲得要修改的文檔或源代碼等文件的過程稱為提取。
提交(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"http://創建一個名為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 軟件項目過程中出現的版本混亂、代碼整合難等問題,實現對項目源代碼和文檔的集中式管理,提高軟件開發效率。