我們之前常遇到一個狀況,當開發人員把方案/專案被建立並加入到 TFS 進行版本控管後,然後很開心的使用 NuGet 功能加入套件,不過卻忘記把 packages 也一併加入到 TFS 原始碼控管裡,以致於其他開發源開專案時變的無法管理 NuGet 套件的情況,這個問題到了 NuGet 1.6 開始已經獲得了改善,你現在可以使用 Enable NuGet Package Restore 功能徹底解決這個問題。
我們先來重現這個問題:
對於有啟用 NuGet 的專案,都會有個 packages.config 檔案
該檔案會含有該專案所有 NuGet 套件的名稱與版本資訊:
然而,所有已下載的 NuGet 套件檔案都會放在方案根目錄下的 packages 目錄裡:
如果一切正常,檔案目錄都存在的情況,當你執行 Manage NuGet Packages 時:
你會在 Installed packages 看見目前已經安裝的套件清單:
不過如果當你把方案根目錄下的 packages 資料夾砍掉(也就是當 UserA 沒有把 packages 目錄手動簽入 TFS,然後 UserB 把專案取出的狀況),在執行 Manage NuGet Packages 就會發生悲劇,如下圖,你會看到目前專案沒有任何已安裝套件的情況:
從 NuGet 1.6 開始,新增了一個 Enable NuGet Package Restore 功能,就是用來解決這個問題,只要你專案裡的 packages.config 設定檔還在,你就可以在 建置 (Build) 的時候 自動將遺失的 NuGet 套件回復,以下是啟用的步驟說明:
1. 先在「方案總管」裡選取方案,點選滑鼠右鍵,在點選 Enable NuGet Package Restore
啟用之後,你會發現在方案裡多了一個 .nuget 方案目錄,該目錄下也會有兩個檔案,其中 NuGet.exe 是 NuGet 指令列工具,而 NuGet.targets 則是 MSBuild 的設定檔。如果該方案原本就已經加入到 TFS 的話,這些目錄與檔案都會自動被加入 TFS 原始碼控管裡。這個 .nuget 目錄的實體路徑會位於方案根目錄下,如下圖示:
2. 由於我們剛剛已經把方案根目錄下的 packages 資料夾砍掉,你現在可以試著按下 F6 功能鍵進行建置,這個 packages 資料夾會自動被重新建立,而且裡面的 NuGet 套件也會在建置的過程中自動下載。
備註事項
- 如果你在升級 NuGet 的過程中發生問題 (通常是程式碼簽章憑證不一致的問題),你可以先移除現有的 NuGet 舊版,然後再重新安裝新版 NuGet 即可。
- 有了 Enable NuGet Package Restore 這功能,今後你就可以不用再 Check-in 所有 NuGet 套件到版本控管裡,當專案多的時候也可以節省不少磁碟空間。
相關連結