原文:http://blog.darkthread.net/post-2016-03-02-clean-nuget-packages.aspx
作者是宝岛兄弟,提供了一个很好的思路,转摘文章如下:
NuGet已是開Visual Studio寫專案的必備工具,用關鍵字找到項目就能安裝,有新版本點一下就更新,非常方便。
我們遇到一項困擾:NuGet在升級程式套件前會移除專案的舊版DLL,至於packages目錄下的舊版檔案若已無其他專案參照,也會一併刪除,理論上不會累積。依NuGet 文件說明,packages目錄之檔案移除原則如下:
不過因為我們配合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有,但實體路徑沒有):
比對結果就是所有被刪除的檔案,酷!