May 11, 2014

多方案檔環境下共用Nuget Package Restore資料夾位置

NuGet提供的Package Restore功能可以讓開發人員在編譯程式碼時才將所參考的third-party函式庫下載回來,而不需放進source code repository。在大部份情況下,開發的系統可能只有一個方案檔,建置方案後nuget預設會將函式庫放在packages資料夾,且與方案檔位在相同路徑下。

前陣子在幫公司系統做架構重整,利用git submodules功能將幾個核心函式庫專案獨立出來放到專屬的repository且有自己的方案檔可以開啟這些專案進行修改。引用到核心函式庫的客制化專案則放到另一個專屬的repository也同樣擁用自己的方案檔。

在如此架構下,如果將客制化專案的repository拉回本機,資料夾的結構就像下方,SubmoduelsDemo-Sub是核心函式庫,而SubmoduelsDemo-Main為客製化專案。



如果編譯SubmoduelsDemo-Sub方案檔,其packages資料夾便會建立在SubmoduelsDemo-Sub資料夾內,這點毫無疑問。

但問題來了,如果事先不開啟SubmoduelsDemo-Sub方案檔編譯,而是直接開啟SubmoduelsDemo-Main方案檔編譯,SubmoduelsDemo-Sub資料夾內並不會有packages資料夾產生,因為nuget預設會以當下被編譯的方案檔(SubmoduelsDemo-Main)所在路徑來建立packages資料夾。如此,核心函式庫在編譯時就會因為找不到third-party參考而建置失敗,因為它是參考到SubmoduelsDemo-Sub資料夾內的packages資料夾。

為了解決這個問題,nuget提供了透過修改設定檔(NuGet.Config)的方式,讓我們變更packages資料夾的預設路徑,如下加入repositoryPath設定
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="repositorypath" value="..\SubmodulesDemo-Sub\packages" />
  </config>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
</configuration>

要注意的是,這個路徑是相對於NuGet.Config檔案的路徑。此外,在能使用這項設定前,請先將nuget更新到最新版本。設定完成後建置SubmoduelsDemo-Main方案,就可以看到packages資料夾建立在SubmoduelsDemo-Sub資料夾內。



完整範例可參考SubmodulesDemo-MainSubmodulesDemo-Sub