在引用多目标 class 库时,如何让 NuGet 知道包的特定版本?
How do I make NuGet aware of a specific version of a package while referencing a multi-targeted class library?
我们有三个项目:
WebApp.csproj
、ASP.NET 针对 .NET Framework 2.0 编译的 WebForms 应用程序
Api.csproj
、ASP.NET 针对 .NET Framework 4.5 编译的 WebApi 2
Lib.csproj
,针对 .NET Framework 2.0 编译并被上述两个项目引用。
Lib.csproj
已在新的 .NET 项目格式(.NET Core 使用的格式)中重新创建,并使用 <TargetFrameworks>net20;net45</TargetFrameworks>
技术针对 .NET Fw 2.0 和 4.5。
到目前为止一切顺利,我可以通过在 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
指向目标 net45
的 Lib.csproj
版本,如下所示:
<ProjectReference Include="..\..\Lib\Lib.csproj" AdditionalProperties="TargetFramework=net45">
<Project>{32e77bcf-152c-4b64-be37-a13f49cdcab6}</Project>
<Name>Lib</Name>
</ProjectReference>
net20
版本引用 NLog 2.1.0
,net45
一个 NLog 4.7.8
。
问题:现在我想在 Api.csproj
中使用 NLog 4.7.8
,但是当我在包含 Api.csproj
和 [=15] 的解决方案上单击 Manage Packages for Solution
时=],引用的版本似乎是 2.1.0
.
我尝试选择这两个项目并安装它,但是我正确地得到了一个错误,因为 NLog 4.7.8
与 net20
不兼容。
所以真的,问题是 NuGet 似乎没有意识到我引用的项目是一个多目标项目,甚至只看到 net20
版本中安装的 NLog 版本虽然 Api.csproj
的目标是 Lib.csproj
的正确“风味”(如果我去检查二进制文件,复制到输出文件夹的 NLog.dll 版本对每个文件都是正确的我的目标)。
我尝试在互联网上查找,但无济于事。
公平地说:复制到 Api.csproj
的 bin
文件夹的 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 格式。这对于遗留(核心前)网络项目是不可能的,WebApp.csproj
和 Api.csproj
就是这种情况。但是,即使是那些项目也可以使用 较新的 csproj 格式的某些部分。
具体来说,they can use PackageReference
。我假设您现有的 Web 项目正在使用 nuget.config
,但可以将它们更改为使用 PackageReference
,而无需实际将它们制作成 SDK 样式的 csprojs。当使用 nuget.config
时,NuGet 在传递依赖方面存在一些问题,所以我只建议在任何地方都使用 PackageReference
。
我们有三个项目:
WebApp.csproj
、ASP.NET 针对 .NET Framework 2.0 编译的 WebForms 应用程序
Api.csproj
、ASP.NET 针对 .NET Framework 4.5 编译的 WebApi 2
Lib.csproj
,针对 .NET Framework 2.0 编译并被上述两个项目引用。
Lib.csproj
已在新的 .NET 项目格式(.NET Core 使用的格式)中重新创建,并使用 <TargetFrameworks>net20;net45</TargetFrameworks>
技术针对 .NET Fw 2.0 和 4.5。
到目前为止一切顺利,我可以通过在 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
指向目标 net45
的 Lib.csproj
版本,如下所示:
<ProjectReference Include="..\..\Lib\Lib.csproj" AdditionalProperties="TargetFramework=net45">
<Project>{32e77bcf-152c-4b64-be37-a13f49cdcab6}</Project>
<Name>Lib</Name>
</ProjectReference>
net20
版本引用 NLog 2.1.0
,net45
一个 NLog 4.7.8
。
问题:现在我想在 Api.csproj
中使用 NLog 4.7.8
,但是当我在包含 Api.csproj
和 [=15] 的解决方案上单击 Manage Packages for Solution
时=],引用的版本似乎是 2.1.0
.
我尝试选择这两个项目并安装它,但是我正确地得到了一个错误,因为 NLog 4.7.8
与 net20
不兼容。
所以真的,问题是 NuGet 似乎没有意识到我引用的项目是一个多目标项目,甚至只看到 net20
版本中安装的 NLog 版本虽然 Api.csproj
的目标是 Lib.csproj
的正确“风味”(如果我去检查二进制文件,复制到输出文件夹的 NLog.dll 版本对每个文件都是正确的我的目标)。
我尝试在互联网上查找,但无济于事。
公平地说:复制到 Api.csproj
的 bin
文件夹的 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 格式。这对于遗留(核心前)网络项目是不可能的,WebApp.csproj
和 Api.csproj
就是这种情况。但是,即使是那些项目也可以使用 较新的 csproj 格式的某些部分。
具体来说,they can use PackageReference
。我假设您现有的 Web 项目正在使用 nuget.config
,但可以将它们更改为使用 PackageReference
,而无需实际将它们制作成 SDK 样式的 csprojs。当使用 nuget.config
时,NuGet 在传递依赖方面存在一些问题,所以我只建议在任何地方都使用 PackageReference
。