【问题标题】:How do I make NuGet aware of a specific version of a package while referencing a multi-targeted class library?在引用多目标类库时,如何让 NuGet 了解包的特定版本?
【发布时间】:2021-03-15 16:08:04
【问题描述】:

我们有三个项目:

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.csproj 指向Lib.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.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 的正确“风格”(如果我去检查二进制文件,复制到输出文件夹的 NLog.dll 版本对于我的每个目标都是正确的)。

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

公平地说:被复制到Api.csprojbin 文件夹的NLog 版本是正确的,所以它不是一个炫技。但这有点烦人,因为 NuGet 显示了我的依赖项的错误版本,然后很难判断我们实际使用的是哪个版本。

为了一点上下文:这个应用程序显然是古老的,至少WebApp.csproj。由于性能原因,我们让Api.csproj 使用async/await,并且由于该项目引用了可以在Lib.csproj 中异步但显然无法在.NET 2 下编译的代码,我们选择使Lib.csproj 多- 有针对性的。

【问题讨论】:

    标签: c# .net nuget multitargeting


    【解决方案1】:

    这里的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

    【讨论】:

    • 哇,Async/Await 先生自己回复了!非常感谢斯蒂芬,我一定会考虑升级到PackageReference,看看是否能解决问题。对于它的价值,AdditionalProperties 是我可以让项目引用针对正确框架的版本的唯一方法,也许我错过了一些东西。默认是接net20的,和我一直在读的一致。
    • @s.m.:它应该默认使用 net45 构建,因为它匹配 Api.csproj 目标框架。
    • 这正是我的想法,但它似乎拿起了net20的味道。我明天再试一次,今天很忙。再次感谢,伙计:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2012-04-30
    • 2020-12-01
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多