繁体   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