指定 NuGet packages 存放位置

同事負責的 team 有個專案,因為歷史緣故因素裡面有超過二十個 projects,實際上各個專案間並沒有相依或是關連性,正確的做法應該要把各個專案拆分開來,但拆分的動作不僅影響開發流程,連 CI Server 這邊也需要一併調整,冒然行事可能會造成問題,所以還需要完整規劃該如何拆分。

只是目前遇到的問題還是要先解決,這二十來個 projects 有各自獨立的 NuGet 參考,packages 是分開的,問題發生在 clone 這個專案時會需要一併 clone 這全部二十來個 projects,packages 也會一併被 clone,加上這二十幾個 projects 都是 WEB Api 專案,NuGet 參考大多數都一樣,造成空間被無謂的佔用,平均一個 project 的 packages 約需 200 MB,二十來個就超過 4 GB,這在開發人員電腦上可能還好,但在 CI Server 上就是個大負擔,硬碟空間跟網路 IO 都是,所以打算做些調整,至少讓這二十來個 projects 可以共用 NuGet 套件參考,順利的話應該可以省下 95% 的空間XD 接下來就讓我們看看該如何設定吧

加入 nuget.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>  
  <config>
    <add key="repositoryPath" value="..\Packages" />
  </config>
</configuration>
  • 可以指定 絕對路徑 或是 相對路徑
  • nuget.config 可以是 solution level 或是 project level

    • solution level,請將 nuget.config.sln 放在一起
    • project level,請將 nuget.config.csproj 放在一起

修改 .csproj

因為修改了 NuGet 套件的存放位置雖然 NuGet restore 會重新下載相關套件,但因 .csproj 已經紀錄了套件位置會導致專案 Reference 都跑掉,所以需要重新指定 dll 位置

  • Reference 遺失

    1referencemiss

  • 卸載專案

    專案上按右鍵 –> Unload Project

    2unloadproject

  • 編輯 .csproj 檔

    已卸載專案上按右鍵 –> Edit .csproj

    3editcsproj

  • 修改 Reference 的參考路徑

    將 Reference 的 HintPath 改至正確位置

    4hintpath

  • 重新載入專案

    已卸載專案上按右鍵 –> Reload .csproj

    5reloadproj

  • Reference 正常

    6referenceok

心得

修改的工並不多,但測試過程還滿麻煩的: nuget.config 修改後,需要關閉專案重開才會生效,不然 nuget.config 會有 cache。實際修改專案時相對路徑常會有階層填錯的問題,算是苦工呀

參考資訊

  1. Setting up a common nuget packages folder for all solutions when some projects are included in multiple solutions