跨解決方案引用專案的潛在NuGet路徑問題

案情說明:

     

我有個共用元件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套件」,應可減少類似問題發生。

歡迎推文分享:
Published 16 August 2016 11:22 PM 由 Jeffrey
Filed under:
Views: 3,315



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<August 2016>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication