Nuget 不尊重包引用配置?



我有一个项目需要针对多个版本的CefSharp(它是使用CefSharp并指示版本的父级的插件(。 我的 .csproj 文件中有以下内容,使用对 NuGet 包的包引用:

<PackageReference Include="cef.redist.x64" Condition="'$(Configuration)' == 'Debug 2020' Or '$(Configuration)' == '2020'">
<Version>3.3325.1758</Version>
</PackageReference>
<PackageReference Include="CefSharp.Common" Condition="'$(Configuration)' == 'Debug 2020' Or '$(Configuration)' == '2020'">
<Version>65.0.1</Version>
</PackageReference>
<PackageReference Include="CefSharp.Wpf" Condition="'$(Configuration)' == 'Debug 2020' Or '$(Configuration)' == '2020'">
<Version>65.0.1</Version>
</PackageReference>
<PackageReference Include="cef.redist.x64" Condition="'$(Configuration)' != 'Debug 2020' And '$(Configuration)' != '2020'">
<Version>3.2987.1601</Version>
</PackageReference>
<PackageReference Include="CefSharp.Common" Condition="'$(Configuration)' != 'Debug 2020' And '$(Configuration)' != '2020'">
<Version>57.0.0</Version>
</PackageReference>
<PackageReference Include="CefSharp.Wpf" Condition="'$(Configuration)' != 'Debug 2020' And '$(Configuration)' != '2020'">
<Version>57.0.0</Version>
</PackageReference>

当我在"调试2017"配置中构建它时,它应该给我版本57.0.0,但我得到的是65.0.1。 如果我完全删除对 65 的引用,但不对条件或构建配置执行任何操作,那么现在它看起来像这样:

<PackageReference Include="cef.redist.x64" Condition="'$(Configuration)' != 'Debug 2020' And '$(Configuration)' != '2020'">
<Version>3.2987.1601</Version>
</PackageReference>
<PackageReference Include="CefSharp.Common" Condition="'$(Configuration)' != 'Debug 2020' And '$(Configuration)' != '2020'">
<Version>57.0.0</Version>
</PackageReference>
<PackageReference Include="CefSharp.Wpf" Condition="'$(Configuration)' != 'Debug 2020' And '$(Configuration)' != '2020'">
<Version>57.0.0</Version>
</PackageReference>

我得到版本 57。 这很好,但是对于 2020 年的版本,我需要它来引用 65.0.1... 为什么不尊重条件??

从逻辑上讲,基于第二个测试,v57 条件的评估必须为 true,因为它在 v65 引用不存在时生成和输出。 这会让我相信顶级的评估也是真实的,并"赢"给了我 v65。 但是,条件语句在逻辑上是相反的,并且是相互排斥的,不是吗? 这意味着它们不可能都是真的...... 我错过了什么?

编辑

运行了另一个测试,其中只有 v65 引用(条件仍然存在(,我确实在输出中得到了 v65 dll...... 使用名为"Debug 2017"的配置,这些如何评估为真?

好的,经过一些额外的研究,我想通了,这要归功于这个链接。 显然,包引用不支持配置条件,仅支持目标框架(呃(。 根据本文的解决方法,您可以使用选择/时间执行此操作。 这是我最终得到的似乎有效的:

<Choose>
<When Condition="'$(Configuration)' == 'Debug 2020' Or '$(Configuration)' == '2020'">
<ItemGroup>
<PackageReference Include="cef.redist.x64">
<Version>3.3325.1758</Version>
</PackageReference>
<PackageReference Include="CefSharp.Common">
<Version>65.0.1</Version>
</PackageReference>
<PackageReference Include="CefSharp.Wpf">
<Version>65.0.1</Version>
</PackageReference>
</ItemGroup>
</When>
<When Condition="'$(Configuration)' != 'Debug 2020' And '$(Configuration)' != '2020'">
<ItemGroup>
<PackageReference Include="cef.redist.x64">
<Version>3.2987.1601</Version>
</PackageReference>
<PackageReference Include="CefSharp.Common">
<Version>57.0.0</Version>
</PackageReference>
<PackageReference Include="CefSharp.Wpf">
<Version>57.0.0</Version>
</PackageReference>
</ItemGroup>
</When>
</Choose>

编辑

我对"否则"块仍然有点麻烦,所以我将其切换到两个条件相反的"何时"块。 看起来不太干净,但似乎效果更好...

最新更新