前陣子在幫公司系統做架構重整,利用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-Main及SubmodulesDemo-Sub。