gpt4 book ai didi

c# - 在引用多目标类库时,如何让 NuGet 知道包的特定版本?

转载 作者:行者123 更新时间:2023-12-04 01:05:26 26 4
gpt4 key购买 nike

我们有三个项目:

WebApp.csproj , 针对 .NET Framework 2.0 编译的 ASP.NET WebForms 应用

Api.csproj , 针对 .NET Framework 4.5 编译的 ASP.NET 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.csprojLib.csproj 的版本瞄准 net45 ,像这样:

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

net20版本引用 NLog 2.1.0 , net45NLog 4.7.8 .

问题:现在我想使用NLog 4.7.8在我的 Api.csproj , 但是当我点击 Manage Packages for Solution关于包含 Api.csproj 的解决方案和 Lib.csproj , 引用的版本似乎是 2.1.0 .

我尝试选择这两个项目并安装它,但是我正确地得到了一个错误,因为 NLog 4.7.8net20 不兼容.

真的,问题是 NuGet 似乎没有意识到我引用的项目是一个多目标项目,并且只看到安装在 net20 中的 NLog 版本。版本即使Api.csproj正在针对 Lib.csproj 的正确“ flavor ” (如果我去检查二进制文件,复制到输出文件夹的 NLog.dll 版本对于我的每个目标都是正确的)。

我尝试在互联网上查找,但无济于事。

公平地说:复制到 Api.csproj 的 NLog 版本的 bin文件夹是正确的,所以它不是一个showstopper。但这有点烦人,因为 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 格式的某些部分

具体来说,they can use PackageReference .我假设您现有的 Web 项目正在使用 nuget.config,但可以将它们更改为使用 PackageReference,而无需实际将它们制作成 SDK 样式的 csprojs。当使用 nuget.config 时,NuGet 在传递依赖方面存在一些问题,所以我只建议在所有地方使用 PackageReference

关于c# - 在引用多目标类库时,如何让 NuGet 知道包的特定版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66641581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com