2017-08-14 100 views
0

短版的NuGet:強制項目選擇了更爲具體的目標框架在netstandard

我創作一個包,面向.NET標準1.3和1.6。我的1.6版本參考文獻System.Runtime.Loader。這個軟件包有一個用於MonoAndroid框架的placeholder,這意味着我的NuGet軟件包現在無法在Android 7.x項目中加載。

我的.NET標準1.3版本沒有這種依賴性。我如何強制NuGet加載Android項目的netstandard-1.3版本,而不是netstandard-1.6?

更多詳細信息

當我嘗試在使用project.json一個Android 7項目加載我們當前的包,我看到下面的錯誤消息:

System.Runtime.Loader 4.3.0 provides a compile-time reference assembly for System.Runtime.Loader on MonoAndroid,Version=v7.1, but there is no run-time assembly compatible with win. 

我的理解是,這是由System.Runtime.Loader NuGet package使用多個目標框架的佔位符造成的。此封裝件的結構,是因爲這樣:

lib -> netstandard1.5 -> System.Runtime.Loader.dll 
     MonoAndroid10 -> _._ 

我還包一個netstandard-1.3構建我的包,它不引用System.Runtime.Loader組件。我很高興Android用戶能夠在1.3版本中獲得簡化的功能 - 但我無法弄清楚如何強制NuGet選擇.NET Framework 1.6的框架。

我目前的封裝結構如下:

lib -> netstandard1.3 -> build13.dll 
     netstandard1.6 -> build16.dll 

我試圖將其更改爲下面的 - 給力的NuGet挑選更具體的目標框架,但的NuGet似乎更喜歡netstandard1.6超過MonoAndroid 。 (我也嘗試MonoAndroid10)

lib -> netstandard1.3 -> build13.dll 
     MonoAndroid -> build13.dll 
     netstandard1.6 -> build16.dll 

有什麼辦法,作爲一個包的作者,我可以強迫我的下游用戶的Android項目使用.NET 1.3標準建立我的項目,而不是1.6構建,由於System.Runtime.Loader包中的佔位符項目而無法恢復?

+0

如果存在更具體的目標框架,NuGet應該選擇比netstandard更具體的目標框架。如果這沒有發生,那麼我將捕獲NuGet輸出並在http://github.com/nuget/home/issues –

+0

@Chris上打開一個錯誤,當您更改爲打包以包含「MonoAndroid」的dll時,您是否也更新nuspec以包括mono android版本的依賴組?另外,在這種情況下它應該是'MonoAndroid10'。 –

+0

@MartinUllrich我做到了。我注意到生成的nuspec將'MonoAndroid10'(我輸入的)的tfm更改爲'MonoAndroid1.0' - 我不知道這裏是否有任何關聯。 – Chris

回答

0

我最終發現這是一個緩存問題。

我假定NuGet應該如何工作的一切都是正確的。問題是NuGet似乎緩存了軟件包的依賴性,所以當我重建我的軟件包時,它仍然使用舊的依賴列表。令人惱火的是,這只是一個內部緩存 - Visual Studio UI使得我的新包的依賴性被正確識別,但日誌顯示了正在安裝的舊依賴。

解決方案是清除每個重新打包之間的NuGet緩存。