2016-11-15 123 views
0

我有一個包X,取決於另一個包Y.默認情況下(Visual Studio 2015 Upd3 + nuget 3.5)引用到包X的任何項目都將參考包Y更新。問題是,X的客戶根本不需要參考Y,因爲Y包的API不是也不應該暴露給客戶。非傳遞包依賴關係?

因此,預期的行爲是繼:後加入參考打包X,包的Y內容應該複製到輸出文件夾中生成,但包ÿ不應該被添加到項目引用。

有沒有什麼辦法呢?

理論上我們可以包括基礎架構包的Y來源爲我們的項目X(這兩個項目都在MIT許可開源的),但我寧願使用或多或少的標準方法。

爲什麼我們需要它的情況的例子:

  • 我們現在正在對此案進行調查:即確保PDB文件相匹配的來源(參考Microsoft.DiaSymReader包)NuGet包與測試幫手。我們不希望我們所有的測試項目都參考Microsoft.DiaSymReader程序集。

  • 或多或少是理論上的問題(現在不是問題,但如果項目將投入生產將會成爲問題):使用Roslyn編譯和運行腳本的自定義腳本引擎。我們不希望在所有將使用腳本引擎的項目中引用Roslyn程序集。

後一種情況更糟糕,因爲我們不能合併羅斯林源到我們的項目中,很明顯,和我們的包的一部分,不能分發羅斯林二進制文件了。

歡迎任何建議!

回答

0

既然你是包X的作者,這是給你什麼你在nupkg文件中包含。您還可以包含第三方dll。

雖然在技術上是可行的,我不建議這樣做。想想消費者你的包X,誰1天可能決定使用包Y.突然,他們將獲得運行時錯誤的,因爲X是期待不同的版本Y.

+0

是的,我們也在考慮這個選項,但它可能導致無法解決的依賴衝突。例如:我們提供Y.dll v1.0作爲我們軟件包X的一部分,第三方項目引用我們的軟件包X,然後添加對Y v2.0包的明確引用。對於像Roslyn這樣的大型基礎設施依賴項來說,這絕對不行。所以我們寧願留在正常的nuget依賴關係中,但不要將它們包含到客戶的項目引用中 – Sinix

0

您可以添加包Y的DLL文件在內容文件包X,這將不會加上y的dll到該安裝包X.

項目按照以下幾個步驟顯示瞭如何爲Y的dll爲內容文件創建包X。

  1. 通過Add - > Existing Items將Y dll添加到Package X項目中。
  2. 選擇所有Y dlls並右鍵單擊以打開屬性窗口,將「複製到輸出目錄」設置爲「始終複製」。
  3. 包項目X作爲包X與nuget.exe

現在,當你打開包X.nupkg與NuGet Package Explorer文件,你會發現存儲在文件夾中的內容與Y的DLL。當您在其他項目上安裝Package X時,Y dll將作爲內容文件添加到項目中。生成項目後,Y dll將被複制到輸出目錄。

+0

@ botond.botos建議的是同樣的事情。如果我們的客戶添加對Y包的直接引用,將導致版本控制問題。 – Sinix

+0

如果您的客戶直接引用了與您的X包具有不同版本的Y dll,他們可以在應用程序的配置文件中重定向裝配版本:https://msdn.microsoft.com/en-us/library/7wd6ex19(v= vs.110).aspx#Anchor_2 –

+0

是的,但nuget鞏固功能將不能用於這種衝突,他們必須手動解決。如果包裹Y很大,羅斯林就不例外。 – Sinix