Team Foundation Server - 使用NuGet搭配版本控制
支援版本
- NuGet 1.6 up
我們都知道,軟體開發絕對不可以少的東西之一,就是版本控制,無論是使用小烏龜,或是TFS,使用版本控制,好處絕對比想像中的多;那怎樣的版本控制才叫好呢!?支援的多,支援的功能天花墜無與倫比!?( 讓我想到了以前李立群的Konica底片廣告… ),但不管怎樣,版本控制有一個很重要的要點就是能讓使用者"簽出後,立即能用",而小弟也遵循著這個教誨;之前,在NuGet還沒流行時XDD,也都沒有碰到多大問題;而NuGet出現的一段時間後,小弟還是沒有多大問題XDD( 因為只有小弟我在用XDD ),到如今,NuGet已經變成耳熟能詳,超級簡單好用的工具了,而且因為簡單,大家都會用!,所以也出現了一些災難。
喔,對了,小弟後來也搜尋到,Will保哥也有一篇很完整的文章,如果大家已經看過保哥的文章,就可以不用往下看啦XDD,節省時間去玩Diablo 3吧XDD
NuGet VS TFS
這兩個東西當然不是真的要去VS,因為是完全不一樣的東西啊XDDD;小弟想強調的是,因時代已經有點不一樣了,NuGet的出現,我們不會在像以前一樣,用手動的方式,把dll放到專案裡面 ( 當然,如果NuGet裡面沒有,還是必須手動就是了 );而我們正常在使用TFS時,如果要把檔案或是目錄加入到原始檔控制,TFS會超級佛心的幫我們把*.dll給濾除掉,如下圖。
而也因為NuGet的方便,也因為我們沒有再手動的放東西進去,所以,我們會常常忘記了用NuGet加入的dll,就直接按下完成,就很順理成章的把dll略過了,就像下圖,Moq裡面完全沒有Moq的dll了。
結果會怎樣!?如果是小弟,小弟弄完後,就會很大聲的通知同組人員,來證明小弟的速度很快,然後就會聽到XX聲( 自動消音 )四起,每個人都會喊"不能執行阿!!"。
當然,這個還算好,倒楣的是那種下班急著簽入,然後簽入後人就跑的那種;( 難怪要提倡持續整合XDDD ),當然,結果就是後面一堆人要收尾= =。
沒錯,因為少了dll阿,所以自然就沒辦法執行了,就像下圖。
一堆NuGet的檔案
其次,如果我們把NuGet的東西全部都加入到版控裡面,其實也會佔據非常大的空間,就像下圖,增加一個Json.Net,就會有非常多的東西要簽入。
啟用NuGet套件還原
其實NuGet的套件,都會記錄在packages.config這個檔案裏面,而該需要的檔案和dll,都會放在packages目錄下面,所以在還沒有NuGet套件還原之前,如果不想發生上面那種被人罵慘的錯誤,就必須把很多的東西簽入進去,而如果ㄧ些專案是後來才加入版控的,也可能會因為疏失遺漏掉;當然,NuGet的開發人員,也接受到許多的建議(抱怨!?),所以在1.6版本後,加入了一個"啟用NuGet套件還原"的功能。
這個功能,老實說,看到中文名稱,還是猜不出來是做啥的XDD,其實這個功能最大的用處就是,如果今天放置dll等檔案的packages目錄不存在時,在編譯的時候,會自動地幫我們把缺少的packages目錄補齊!
有沒有很酷!?這樣,我們就可以不用怕忘記把dll加入進去,其次我們的版控,也不需要丟一堆東西。
如何做!?
假設我們這邊要新增一個Json.Net。
新增完後,自然就多了一堆檔案,我們先不管那些檔案,我們在方案的地方,按下滑鼠右鍵,然後選擇"啟用NuGet套件還原"。
然後就會跳出一個視窗,按下確定就可以了。
然後再按下確定後就完成了。
這時套件就會多了這兩樣東西。
接下來,我們從靜止的變更視窗下,選擇所有package目錄下的檔案,並且選則"復原",看是要選擇上面的復原按鈕,或是滑鼠右鍵Menu後的復原按鈕,都可以。
其他的檔案,就照常簽入吧。
然後在原始檔控制總管,將原本的Package目錄給刪除,當然,不刪除其實也是可以,但既然NuGet會自動重建,這個留著其實也沒甚麼意義,記住,選擇刪除後,也要簽入回去。
這時候,如果有其他的使用者,把整個專案簽出來,理所當然,就不會有packages的資料夾,這時候如果編譯,NuGet就自動幫你把缺的東西補齊。
我們去本機的目錄去看,可以發現,已經幫我們把packages目錄給建立好了。
就這樣,我們就完成了!
後記
我們透過NuGet的套件還原機制,就可以不需要把packages目錄簽入進去,就可以省了很多的空間,其次,我們利用這個機制,也可以有效的預防dll忘記加進去版本控制的風險,也提高了版本控制真正的意義,讓簽出的人,可以馬上迅速地進入工作!最後,其實這個機制也可以搭配Build Server;總之,這個機制,讓NuGet與TFS更加的緊密結合。