NuGet已是開Visual Studio寫專案的必備工具,用關鍵字找到項目就能安裝,有新版本點一下就更新,非常方便。
我們遇到一項困擾:NuGet在升級程式套件前會移除專案的舊版DLL,至於packages目錄下的舊版檔案若已無其他專案參照,也會一併刪除,理論上不會累積。依NuGet 文件說明,packages目錄之檔案移除原則如下:
- Files in the solution folder. The folder for the package you removed is deleted from the packages folder. If it is the only package you had installed, the packages folder is also deleted.)
不過因為我們配合Build Service採取 packages簽入TFS策略,雖然NuGet升級時會刪除本機pacakges裡舊版檔案,但習慣上大家不會主動將package刪除操作簽入版控,而TFS版控裡的舊檔仍在,下回Get Latest就又通通跑回來,加上怕Build Service建置失敗,寧可錯加也不敢錯殺的心態,日積月累之下,版控packages裡的項目多如牛毛,一堆無用項目也拖累 Build Service 建置效率。(若Build Service設定成每次建置新開資料夾不覆寫,浪費的頻寬及儲存空間會更可觀)
最後,我們專案的 packages 宛如一座歷史博物館(以下圖),從毛公鼎、唐三彩、青花瓷到漢玉寶塔都有。NLog從2.1.0到4.2.3、Json.NET從5.0.7到7.0.1,各有七個版本。哪些有用哪些沒用,孰可殺誰該留則是個謎!讓開發小組興起「大掃除」的念頭。
爬文求解,網路上有人提到 Resolve Unused Reference套件,試用發現它主要用於修改 csproj 移除沒用到參照,移除 packages 屬於附加功能,而強行移除專案未用參照的做法有點粗暴,有違我只想清理 packages 舊版的原意,再加上一些被它誤殺導致無法編譯的Bug回報(提醒:要使用它前務必先 Check In 或備份,以免造成遺憾。),此一選項迅速被排除。
最後,想到一解,先手動將本機 packages 目錄清空,再借用 NuGet 還原功能重新下載(如果有多個 sln 共用 packages 目錄,務必逐一還原或重新編譯以防漏載),做完一輪,理論上 packages 就只會剩下各專案所需的必要版本的聯集。TFS 似乎沒有功能自動將本機缺少的檔案從版控刪除(實務上很少有此需求),我想到的愚公移山法是在 TFS Source Explorer 逐項巡視,若Local Path 未出現藍底連結表示資料夾不存在,可以安心刪除。(補充:文末有更有效率的做法)
最後共計刪掉55個無用舊版資料夾,packages 目錄總算清爽多了。
【2016-03-03更新】
抛磚引玉成功,Franma 大人開示使用 TFS 比對功能快速找出被刪檔案的妙計,下回就不用再愚公移山囉!特此感謝。
步驟為在 Solution Explorer packages 目錄叫出右鍵選單執行 Compare:
選擇只列出在來源路徑出現的檔案(TFS有,但實體路徑沒有):
比對結果就是所有被刪除的檔案,酷!