[NuGet] 解決 HintPath 造成的編譯問題

  • 3254
  • 0
  • 2016-12-26

有些 NuGet  package 在加入後,會修改你的 project 檔案,加上 HintPath,但是如果你的 repo 是會跟人家共用的話,就有可能遇到這個問題

如果你的 solution 裡面,不管是用怎樣的方式,用了另外一個 repo 的 library 當作共用的 library時,有機會就遇到 NuGet 路徑的問題。
有些 NuGet package 在安裝的時候就會修改你的 project 檔案
目前看到似乎是在 .NET 的 project 比較常見, UWP 的沒看到,也許是 UWP 目前的 NuGet 還是用 project.json 來記錄的關係?!但不知道以後會不會改
你可以看到你的 project 檔案裡面多了像下面這段
 
<Reference Include="GalaSoft.MvvmLight, Version=5.2.0.37222, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
  <HintPath>..\..\packages\MvvmLightLibs.5.2.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
  <Private>True</Private>
</Reference>

這個時候,如果你擺放的路徑剛好就不是符合需求的時候,在 compile 的時候就會發生 compiler 跟你說 pakcage 找不到的問題

查了一下,發現解法似乎有兩種
  1.  修改那個 HintPath 的路徑:這個很顯而易見的答案,不過這個不適合用在我的情境,因為那個 Library 的 sourceCode 是另外一個 repo 的,所以如果我修改了,一旦我更新回去那個 repo,反而會造成那個 repo 自己無法編譯
  2. 用 NuGetReferenceHintPathRewrite 這個 NuGet package 來動態的替換掉那個 HintPath :順利的解決了我的問題
下面是 NuGetReferenceHintPathRewrite 的 NuGet package 的位置
https://www.nuget.org/packages/NuGetReferenceHintPathRewrite/
它其實是一個 openSource 的 project,並且在 Github page 裡面有解釋它怎麼做到的
https://github.com/jstangroome/NuGetReferenceHintPathRewrite
不過還是有能力限制
  1. 只限定於 NuGet Package 而已,自己用 dll 的方式加入的 reference 沒救
  2. 其實 project 檔案的最下面可能還有一些限制,例如在 <Import Condition></Import> 的區段,在 Condition 也有可能會有路徑的問題,這時候其實可以把這邊刪掉,嘗試過應該是沒有什麼影響
不過還是要碎嘴一下,喵的那個 HintPath 是什麼爛機制 ="=