簡體   English   中英

為什么應用程序需要一些 nuget 包引用?

[英]Why are some nuget package references required by applications?

我有一個問題困擾了我一段時間。 幾年前,當我使用 log4net 處理圍繞某些托管提供程序實例編寫通用日志記錄包裝程序時,我遇到了這個問題。

這個想法很簡單,我想編寫一個日志記錄和指標,將所有實現隱藏在一個單獨的 Visual Studio 項目中,所以當你想向另一個應用程序添加任何遙測支持時,你可以只包含該項目,新建一個實例logger 並使用通用調用開始記錄。 如果您曾經切換過提供程序或調整日志記錄設置,則不需要對主機應用程序進行任何更改。

這創建了一個強解耦點,其中主應用程序使用日志類庫中的接口,但對日志類庫用於執行實際工作的包或提供程序一無所知。

當我這樣做並嘗試使用 Loggly 的 nuget 包和 log4net 時,我發現調用應用程序必須有一個對 nuget 包的引用,否則依賴程序集不會被復制到構建目錄中。 當時我只是把這寫成他們 Loggly 工程師正在做的一些奇怪的事情。 但此后我在某些包中遇到了相同的行為,但不是所有其他包。 (DogstatsD 沒有問題,Raygun 有問題,等等。)

我注意到程序集中的一些 nuget 包會自動復制到父輸出目錄中,但是當我查找控制它的設置時,我找不到它。

多年來,我編寫了數十個類庫,並且我從未遇到過在構建時解決“鏈接依賴程序集(a refs b、b refs c 等)”的問題。 似乎只是一些有問題的 nuget 包。

如何強制類庫項目引用的 nuget 包復制到構建目錄中,而無需在應用程序中明確引用?

好的,我想通了這一點。

這僅是 Log4Net 和 Loggly 包裝器程序集組合的問題,特別是因為它在運行時完全被引用。 Log4net 在運行時加載其所需的日志附加程序,並且因為 .net 在構建時沒有看到對程序集的引用,它假定它沒有被使用並省略將所需的程序集復制到 bin 目錄。 當您知道這很簡單時,解決方案很簡單,只需在引用的庫中編寫一個空的虛擬方法,您可以在主應用程序中調用該方法。 這將導致 .net 在構建中包含程序集。

雖然此問題特定於 Log4net 庫,但它可能發生在您使用僅用於運行時反射的程序集的任何地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM