加入RUN!PC粉絲團
最近新增的精選文章
 
最多人點閱的精選文章
 
 
精選文章 - 開發技術
分享到Plurk
分享到FaceBook
 
TFS 2012對原始碼控制所做的強化
文‧圖/胡百敬 2012/8/28 下午 05:35:20

原始碼版本控管是團隊開發的重中之重,微軟的「Team Foundation Server(以下簡稱TFS)」團隊對研發與改良版控不遺餘力[註:微軟自己應該是倚靠這個平台與開發工具進行團隊合作、版本控管最重度的使用者:)],自TFS 2005面市以來,其功能特色表列如下:

●完整(Atomic)簽入:搭配SQL Server資料庫交易管理的能力,完整簽入多個程式碼檔案。
●與開發工具整合:可搭配TFS做版控的程式並非侷限於新版的Visual Studio。
 □例如:Visual Studio、SSDT、BIDS、SQL Server Management Studio、Eclipse…等,皆可以使用TFS的版控功能。
●與工作項目(Work item)整合:讓簽入程式碼與工作整合,串聯起來程式碼與需求、Bug、測試…等不同面向的工作。
●強化程式碼品質:不僅僅是存入一個開發人員自己認定可以交付的版本。
 □簽入原則:連結工作項目、靜態程式碼分析…等。
 □簽入提示:輸入相關的屬性,例如檢核該份程式碼安全、效能、功能…等的人名。
●擱置(Shelf):將程式碼暫存在TFS伺服器,而非簽入成一個版本。
●大資料容量:因為是放入SQL Server資料庫,而非放在檔案伺服器上,可提供更多人同時存取更大量的資料。
●分支模型:為不同的程式碼用途建立不同的分支(Branch)。
●安全:授權角色或個人對程式碼可操作的行為。
●支援分散式團隊:可透過網際網路存取TFS,當異地的開發團隊有多人存取時,可以建置代理伺服器(Proxy Server)。
●伺服器和本機的工作區(Workspace):工作區是將TFS伺服器的程式碼對應到你本機硬碟上,並透過規則限制你可以如何操作在本地機器上的程式碼。
●程式碼比較與合併:視覺化的比較與合併方式,解決程式碼版本間的衝突。
●SDK 和 VS 的擴充能力:TFS除了提供豐富的使用者介面程式(Team Explorer、Power Tools…等),也提供了命令提示列工具程式(tf、tfpt…等),而TFS本身提供應用程式伺服器就是Web服務(Web Service)。換句話說,你可以用多種方式透過自行開發的程式與版控整合。
●MSSCCI Plugin:讓TFS的版控可以與多種開發工具整合,包含非微軟的產品。

於2012年8月上市的TFS 2012版再度為原始碼控制新增許多功能,表列如下:
●Team Explorer
●本機工作區
●新的差異比對和合併介面
●透過使用者介面可以在分支間做Baseless合併
●當合併時減少需要手動處理的衝突
●儘量減少modality
●儘量非同步運作
●整合在使用者介面內的復原
●針對擱置集合併
●檢視擱置集的記錄
●Windows/網域帳號用 Friendly 名稱
●維持檔案的簽入時間

針對以上各項新功能,分別說明如下:

「Team Explorer」視窗
與TFS版控結合的主要介面是內嵌在Visual Studio環境內的「Team Explorer」視窗。2012版全新設計該視窗,除了更有層次地呈現更多的資訊,也提供更好的操作效能,不必等待全部的資源都準備好,就可以開始工作。而點選到不同層的頁面時,才呈現該項目的詳細內容。例如:呈現放在SQL Server Reporting Services的報告或SharePoint上的文件,以往「Team Explorer」視窗啟動時就會存取外部的服務,現今是用到時才存取,讓你操作起來更流暢。
透過「Team Explorer」視窗上方類似網頁瀏覽器的工具列,可以在不同頁籤中切換,好存取「Team Explorer」視窗豐富多樣的資訊。並能夠在工具列直接搜尋工作項目的內容,更增操作的便利性。其全新設計的畫面如圖1所示:


▲ 圖1:全新設計的「Team Explorer」視窗有層次地呈現各種資訊


在當點選「Team Explorer」視窗首頁上不同的項目時,其下層視窗有更豐富的資訊,以往可能是放到其他的視窗中,現在則部分整合到「Team Explorer」視窗內。例如:組建的部分資訊整合進來。用於程式碼控管之「暫止的變更」視窗則直接做進「Team Explorer」視窗,而非以往獨立的視窗。
點選圖1「Team Explorer」視窗首頁中「暫止的變更」連結,將可以看到如圖2「暫止的變更」頁面:


▲ 圖2:「Team Explorer」視窗與程式碼控管之「暫止的變更」整合,可以更方便地簽入變更的程式碼


在圖2「暫止的變更」中,有一項設計與以往版本差異很大,就是下方「排除的變更」區塊。若以往批次簽入多個修改過的程式碼檔案時,有些檔案不想簽入(例如:程式設定檔)。以往是透過對話窗勾選,但每次簽入每次都要做勾選動作。現今只要將不想簽入的檔案從「包含的變更」區塊拖曳到「排除的變更」區塊,則簽入時不會再簽入這區中的檔案。
當點選「我的工作」時,可以進入專屬的「我的工作」頁面,呈現透過「工作項目查詢」所取回與自己當下相關的工作,如圖3所示:


▲ 圖3:透過「我的工作」頁面可以看到自己在團隊中各種工作項目與狀態


「我的工作」頁面可以看到自己正在進行中、被中斷而臨時擱置的工作、待完成而未做的工作,以及請求他人檢閱程式碼,或他人請求自己檢閱的程式碼等。這些新加入的功能都會利用TFS版控提供的「擱置」區暫存相關的程式碼。
你可以在「進行中的工作項目和變更」和「可用的工作項目」間互相搬移工作項目,或從「已暫停且擱置的工作」將工作項目移動到「進行中的工作項目和變更」,並透過各區上方的工具列,更新不同工作項目的狀態。
而什麼樣的工作項目會在「我的工作」頁面之「可用的工作項目」區域呈現?可以點選區塊內「開起查詢」連結,檢視工作項目查詢的定義,符合該查詢定義的工作項目就會呈現在「可用的工作項目」區域,如圖4所示:


▲ 圖4:「我的工作」頁面之「可用的工作項目」區域預設呈現自己在此團隊專案中,待辦或進行中的工作


「Team Explorer」歷經了2005、2008、2010三代。至今完全改寫,若你跟我一樣一路走來,或許,也會有跟我一樣的驚喜。

本機工作區
TFS 2012新增「本機工作區(Local workspaces)」功能,讓你可以離線編寫程式碼,一旦連上網路後,自動偵測伺服器與本地兩端的差異[註:以往在連線模式運作時,會自動將所有的檔案屬性設為唯讀,除非你告知伺服器要簽出該檔案,才改成可讀寫。],此種模式也稱為Modify-Merge-Commit。一般而言,以往TFS提供以伺服器端為主的「工作區」適合大型團隊所產出大量的程式碼與檔案,因為是一直保持與TFS版控服務的連線,所以少量修改部分內容而要簽入時,Visual Studio搭配TFS可以區分出變異之處而立刻完成簽入。每個開發人員簽出程式碼也會立刻反映在伺服器,並透過鎖定,讓團隊成員同時修改相同程式碼的衝突減少。
[註:參考http://blogs.msdn.com/b/bharry/archive/2011/08/02/version-control-model-enhancements-in-tfs-11.aspx,此文描述TFS當初的使用者是Visual Studio團隊,他們任何一個分支超過5百萬個檔案,散布在全球的每位開發者,在工作時平均需要10萬至20萬個檔案。而可用的網路頻寬為 300 Kbps。]
但若團隊小,程式碼少,則連線時完整比對並簽入程式碼並不會太耗時,並因為可離線編寫程式碼而提供了較大的彈性。TFS 2012在建立工作區時,預設採用「本機工作區」。其設定畫面如圖5所示:


▲ 圖5:建立原始檔控制的本機工作區


由於Visual Studio的功能已經非常多,要新手記得在哪個選單找到哪個功能實屬不易。故Visual Studio 2012在最外層主視窗右上角加了一個「快速啟動」的功能,你只要在圖5上方Visual Studio視窗之右上方的文字方塊內輸入功能名稱(例如此處的「工作區」),它將會自動提示你選項的取得位置,若直接點選下拉選單中的提示,也可以立刻叫起該功能。
當離線而無法存取TFS時,你依然可以用各種工具編修本機資料夾內的檔案。一旦Visual Studio 2012可以連接到TFS後,會自動將變動的內容更新回伺服器。由於本機工作區會監控目錄的變化,所以若你透過其他的工具程式變更了本機資料夾內的檔案,在Team Explorer「暫止的變更」頁面中,於「包含的變更」和「排除的變更」項目下,會呈現偵測到的變動,如圖6所示


▲ 圖6:自動偵測本機資料夾內的檔案的變更


當筆者連不到TFS時,以「記事本(Notepad.exe)」工具程式修改了兩個檔案,並以檔案總管直接在本機資料夾增加了兩個檔案。其後再連接到TFS,「Team Explorer 2012」自動判讀了那些新增的檔案要加入到原始檔控管,那些檔案變更需要簽入。

新的差異比對和合併介面
當離線編輯的使用者多了,大家簽入時彼此程式碼的衝突勢必增加,TFS 2012/Team Explorer 2012提供全新開發的「合併」編輯器1,以更友善的介面比對差異與編寫新程式碼。讓你以勾選的方式,選擇要將哪些原始碼放入到合併後的原始碼中,也可以直接在合併的位置編寫原始碼,而編寫程式碼的區塊依然提供IntelliSense功能,同時在上方「伺服器」與「本機」區塊中,以斜線的方式標示所編寫程式的對應位置,如圖7所示:


▲ 圖7:透過合併工具編寫簽入檔案間的衝突


除了「合併」更為友善外,原始碼版本間的差異比對也呈現了有差異的程式碼在整體程式碼中的位置,如圖8所示:


▲ 圖8:以更豐富的方式呈現版本歷程間的差異


從圖8右方的縮圖可以知道當下所檢視的程式碼差異比對是在整個程式碼檔中的位置,以及在那些位置有變更過的程式碼。你可以滑鼠直接點選區塊,以跳到該處程式碼。
除了傳統如圖 以兩個視窗比對差異外,VS 2012也新增「內嵌模式」。不同的模式讓你可以選擇自己喜歡的程式碼檢視方式,比較程式版本間的差異:


▲ 圖9:透過不同的模式檢視程式碼間的差異


點選圖9右上方工具列設定各種呈現模式的下拉選單按鈕,即可改變呈現程式碼版本間差異的方式。

透過使用者介面可以在分支間做Baseless合併
以往若要合併(merge)兩個分支(branch)間的程式碼,若要透過使用者介面,則這兩個分支間一定有從屬關係(一個從另一個直接分支出來)。要合併任選的兩個分支來合併,以圖10而言,要合併Feature-Utility和Test兩個分支,它們都是從Dev建立出來的分支,需要利用命令提示列的指令。


▲ 圖10:原始碼分支階層架構


在TFS 2012後,可以在「原始檔控制合併精靈」對話窗,於「目標分支」處點選新增的「瀏覽」按鈕,而後在「瀏覽」視窗選擇要合併的原始碼分支:


▲ 圖11:透過「原始檔控制合併精靈」選擇要合併的「目標分支」


在圖11中,若選擇「目標分支」下拉選單,呈現的依然是直接相關的分支。參照圖10的範例,若「來源分支」是Feature-Utitlity,則「目標分支」下拉選單只能選Dev,因為它是從Dev分支出來,而從它本身並未產生任何分支。

其他
除了上述幾項主要的功能強化外,再簡單說明幾個較小的改良。

合併時減少需要手動處理的衝突
若多個檔案間有差異,TFS儘量以內建的程式邏輯自動化判讀如何完成衝突解決,而不需要開發人員參與決定。當然,若你懷疑自動合併所做的衝突解決,依然可以事後開啟原始檔檢閱。

儘量減少modality
在操控應用程式時,一般人都不喜歡「modal對話窗」,因為該對話窗若不關閉,就無法回到原應用程式繼續工作。尤其是當大量檔案簽入/簽出時,若網路或伺服器效能不佳,可能就讓開發人員卡住。以往,TFS提供的版控只有「伺服器位置」不像在TFS 2012後可以使用「本機位置」。這代表「Team Explorer」以及其他相關視窗要開啟、同步、取得某個版本、過濾搜尋程式碼檔…時,都需要與伺服器溝通。為了要讓開發人員在處理程式碼版本時,還可以流暢地在Visual Studio進行其他工作。在此版本大量移掉modal對話窗,儘量可以非同步的方式,讓上述處理程式碼的工作在背景執行。

儘量非同步作業
要讓開發人員一邊經由版控整理程式碼的同時,還可以順暢地工作。除了上述的離線「本機工作區」與減少「modal對話窗」外。還需要強化非同步作業(有些功能在先前的版本已經是分同步作業,例如:歷程,註釋,原始程式碼瀏覽器)。
列舉此版所強化的非同步工作的例子如下:
●非同步編輯文件。本地工作區幫助我們與版控伺服器分離,所有整合開發環境的檔案狀態也就不一定要更新到版控伺服器。所以,不管連線或離線隨時可以編輯文件。
●非同步簽入,讓你在簽入的過程可以繼續工作。
●非同步搜尋擱置集。
●非同步取得擱置集和變更集的詳細資料。
●非同步比較文件。
除了版本控制之外,其他的操作也儘量非同步,例如打開工作項目。當然,有些動作較難以非同步的方式實作,例如:「取得最新的版本」。

整合在使用者介面內的復原
若要「復原(Rollback)」簽入的版本,在TFS 2010版時,只能利用2011年8月後出的「Power Tools」,或只能以命令提示列指令來執行。在2012版後,整合進「原始檔控制總管視窗」:


▲ 圖12:透過「原始檔控制總管」直接對目錄或檔案執行復原


透過圖12下方的「復原」對話窗,你可以選擇要復原的範圍。

針對擱置集合併
當從擱置集取出暫存的程式碼檔案時,若與本機檔案不同,且需要手動合併,自動提供衝突解決/合併的工具程式,如圖13所示:


▲ 圖13:解決本機版本與擱置集版本間的衝突,自動提供衝突解決/合併的工具程式


若在以往版本,你可能要放棄本機變更後,才能使用擱置集的內容。

Windows/網域帳號用Friendly名稱
在原始檔控制各相關屬性呈現與原始檔有關的使用者名稱時,改用Windows/網域帳號的「全名」呈現,而非Windows/網域帳號名稱。


▲ 圖14:用Windows帳號的「全名」呈現原始檔使用者


在以往版本,TFS部分的欄位採用「全名」,部分採用帳號名,至今全面改用「全名」。

維持檔案的簽入時間
當檔案從TFS管控讀出,並放入到本機檔案系統上時,該檔案的「修改日期(modification time)」屬性以往只能是放到本機檔案系統上的時間。TFS 2012版本後可以設定工作區的「檔案時間」屬性,讓本機檔案之「修改日期」屬性設定的是先前該檔案「簽入」的時間。


▲ 圖15:設定從TFS版控取出檔案存放到本機,該檔案所採用的「修改日期」


在未來的版本中,將再增加一個選項:可以設定為簽入前該檔案最後修改的時間。
除上述的功能外,TFS 2010後,藉由執行在Unix平台的「Team Explorer Everywhere」,可以提供如Java/Eclipse等其他平台開發者整合進TFS,讓企業內各開發團隊較容易地合作。在此版,「Team Explorer Everywhere」也強化了對Unix檔案屬性的支援。


----------
參考資料
Wrapping up TFS 11 Version Control improvements:http://blogs.msdn.com/b/bharry/archive/2011/09/01/wrapping-up-tfs-11-version-control-improvements.aspx
1 參照網誌:http://blogs.msdn.com/b/bharry/archive/2011/08/31/merge-enhancements-in-tfs-11.aspx,TFS以往比對程式碼差異的介面是採用Visual SourceSafe 的同一個工具,而該工具源自1994年的產品強化而來,歷史真悠久:)
----------