案情說明:

     

我有個共用元件LibB,平時放在SlnB.sln這個解決方案開發。之後開發解決方案SlnA.sln需要用到LibB,原本直接引用LibB.dll,因LibB不夠成熟,時常開發到一半要加功能或修Bug。為求效率,我就把LibB.csproj也納入SlnA.sln,方便直接切專案改Code,改完重新編譯馬上測試。LibB加入SlnA後,修改過程我還用NuGet多裝了Autofac程式套件,一切進行順利,直到同事也加入開發…

同事由TFS取回SlnA與SlnB,重新編譯SlnB觸發NuGet還原機制(參考),理應自動下載補齊所有NuGet程式套件,但卻爆出LibB找不到Autofac.dll錯誤。

立即啟動NuGet參照問題SOP:打開LibB.csproj確認Reference HintPath,馬上發現異常。

由於LibB在加入SlnA後才加入Autofac,如以下所示,Autofac的HinetPath指向..\..\SlnA\packages\Autofac…(X:\src\SlnA\packages),而非以..\packages\Autofac...指向所屬解決方案目錄的packages(X:\src\SlnB\packages)

  <ItemGroup>
    <Reference Include="Autofac, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
      <HintPath>..\..\SlnA\packages\Autofac.4.0.0\lib\net451\Autofac.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, 
PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
      <Private>True</Private>
    </Reference>

換言之,當專案掛在哪個解決方案下,新増NuGet套件的位置就會指向當時解決方案的packages目錄。不管裝在哪個解決方案目錄,只要檔案俱在就相安無事,一旦遇到檔案遺失重新取回,或由另一台機器從版控抓回開發時,就可能發生問題。

在本案例中,開啟編譯SlnB時,NuGet套件將還原在SlnB\packages下,但LibB.csproj參照的來源卻是SlnA\packages,SlnA雖已下載但未編譯,NuGet套件還原來不及啟動,SlnA\pakcages目錄不存在,轟~

知道原因一切好辦,我選擇手動將LibB.csproj中的HintPath參照統一改成"..\packages\…"再重新編譯,問題就排除了。但依此經驗,未來如遇跨解決方案引用專案,需留意新増NuGet套件的HintPath路徑指向當下解決方案的特性及日後可能的副作用。一個簡易對策是「回到原解決方案再安裝NuGet套件」,應可減少類似問題發生。


Comments

Be the first to post a comment

Post a comment