簡體   English   中英

在引用多目標 class 庫時,如何讓 NuGet 了解 package 的特定版本?

[英]How do I make NuGet aware of a specific version of a package while referencing a multi-targeted class library?

我們有三個項目:

WebApp.csproj , ASP.NET WebForms 應用程序針對 .NET 框架 2.0 編譯

Api.csproj , ASP.NET WebApi 2 針對 .NET 框架 4.5 編譯

Lib.csproj ,針對 .NET 框架 2.0 編譯並被上述兩個項目引用。

Lib.csproj已在新的 .NET 項目格式(.NET 核心使用的格式)中重新創建,並針對 .NET Fw 2.0 和 4.5 使用 4 <TargetFrameworks>net20;net45</TargetFrameworks>技術

到目前為止一切順利,我可以通過在Lib.csproj中編寫相應的部分來引用不同的 NuGet 包,如下所示:

<ItemGroup Condition="'$(TargetFramework)' == 'net20'">    
    <PackageReference Include="NLog" Version="2.1.0.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
    <PackageReference Include="NLog" Version="4.7.8.0" />
</ItemGroup>

我可以將Api.csproj指向針對net45Lib.csproj版本,如下所示:

<ProjectReference Include="..\..\Lib\Lib.csproj" AdditionalProperties="TargetFramework=net45">
    <Project>{32e77bcf-152c-4b64-be37-a13f49cdcab6}</Project>
    <Name>Lib</Name>
</ProjectReference>

net20版本參考NLog 2.1.0net45參考NLog 4.7.8

問題:現在我想在我的Api.csproj中使用NLog 4.7.8 ,但是當我在包含Api.csprojLib.csproj的解決方案上單擊Manage Packages for Solution時,引用的版本似乎是2.1.0

我嘗試選擇兩個項目並安裝它,但是我正確地得到了一個錯誤,因為NLog 4.7.8net20不兼容。

所以真的,問題是 NuGet 似乎沒有意識到我引用的項目是一個多目標項目,並且只看到安裝在net20版本中的 NLog 版本,即使Api.csproj的目標是正確的“ Lib.csproj的味道”(如果我 go 並檢查二進制文件,NLog.dll 的版本將被復制到 output 文件夾的右側)

我嘗試在互聯網上查看,但無濟於事。

公平地說:被復制到Api.csprojbin文件夾中的 NLog 版本是正確的,所以它不是一個引人注目的版本。 但這有點煩人,因為 NuGet 顯示了我的依賴項的錯誤版本,然后很難判斷我們實際使用的是什么版本。

對於一些上下文:這個應用程序顯然是古老的,至少是WebApp.csproj 由於性能原因,我們使Api.csproj使用async/await ,並且由於該項目引用了可以在Lib.csproj中異步但顯然不會在 .NET 2 下編譯的代碼,因此我們選擇使Lib.csproj多有針對性。

此處的AdditionalProperties不是必需的:

<ProjectReference Include="..\..\Lib\Lib.csproj" AdditionalProperties="TargetFramework=net45">
    <Project>{32e77bcf-152c-4b64-be37-a13f49cdcab6}</Project>
    <Name>Lib</Name>
</ProjectReference>

如果可能,我強烈建議您更新所有項目以使用 SDK 樣式的 csproj 格式。 這對於舊版(核心前) web 項目是不可能的, WebApp.csprojApi.csproj就是這種情況。 但是,即使是這些項目也可以使用更新的 csproj 格式的某些部分

具體來說, 他們可以使用PackageReference 我假設您現有的 web 項目正在使用nuget.config ,但可以將它們更改為使用PackageReference而無需實際制作 SDK 樣式的 csprojs。 當使用nuget.config時,NuGet 在傳遞依賴方面存在一些問題,所以我只建議在任何地方使用PackageReference

暫無
暫無

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

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