Ошибочное разрешение зависимостей для пакета NuGet с несколькими целями

Меня смущает, как разрешаются зависимости при использовании группы - на основе спецификации зависимостей в NuGet.

У меня есть проект Visual Studio, ориентированный на .NET Framework 4.6.1, с зависимостью NuGet от пакета NuGet (внутреннего для моей компании):

Это в файле packages.config моего проекта:

<package id="Name.Of.My.Package" version="2.0.65" targetFramework="net461" />

А это в файле .csproj:

<Reference Include="Name.Of.My.Package, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <HintPath>..\packages\Name.Of.My.Package.2.0.65\lib\net45\Name.Of.My.Package.dll</HintPath> </Reference>

Этот пакет представляет собой многоцелевой пакет со спецификацией зависимостей на основе групп, которая выглядит так, когда я получаю ее прямо из файла .nuspec, полученного путем открытия файла packages\Name.Of.My.Package.nupkg в виде архива:

<dependencies> <group> <dependency id="Newtonsoft.Json" version="11.0.2" /> </group> <group targetFramework=".NETFramework4.0"> <dependency id="Microsoft.Bcl.Async" version="1.0.168" /> </group> </dependencies>

А папка packages\Name.Of.My.Package\lib содержит:

  • нетто40
  • нетто45
  • нестандарт2.0

Итак, я понимаю, что, поскольку мой проект находится в net461, ссылка должна быть добавлена ​​​​в версию моего пакета для net45 (как это кажется в случае, если я смотрю файл .csproj), но что более важно, что единственная неявная зависимость должен быть в Newtonsoft.

Но это происходит, когда я пытаюсь удалить пакет Microsoft.Bcl.Async в консоли диспетчера пакетов:

Uninstall-Package Microsoft.Bcl.Async Attempting to gather dependency information for package 'Microsoft.Bcl.Async.1.0.168' with respect to project 'Name.Of.My.Project', targeting '.NETFramework,Version=v4.6.1' Resolving actions to uninstall package 'Microsoft.Bcl.Async.1.0.168' Uninstall-Package : Unable to uninstall 'Microsoft.Bcl.Async.1.0.168' because 'Name.Of.My.Package.2.0.65' depends on it.

Это происходит в последней версии Visual Studio 2017 (15.8.6).


person Evren Kuzucuoglu    schedule 10.10.2018    source источник


Ответы (1)


Ошибочное разрешение зависимостей для пакета NuGet с несколькими целями

Это правильное поведение nuget. Как мы знаем, .NET Frameworks обратно совместимы. Это означает, что если ваш проект нацелен на v4.6, вы можете использовать пакеты с более низкими версиями, такими как v4.5, v4.0.

NuGet специализируется на проверке совместимости (если пакеты созданы правильно) :) NuGet знает, что доступны платформы v3.5, v4.0, v4.6 и netstandard1.3. Ближайшей совместимой с версией 4.5 платформой является версия 4.0, поэтому при ее установке будут выбраны ресурсы версии 4.0.

Источник: Как выяснить информацию пакетов зависимостей для отсутствующих фреймворков

Таким образом, nuget установит зависимость «ближайшая» обратно совместимая структура v4.6.1, в вашем случае также будет установлена ​​зависимость Microsoft.Bcl.Async.

Вот почему вы не можете удалить пакет Microsoft.Bcl.Async, когда у вас установлен пакет Name.Of.My.Package.

Например, когда вы добавляете пакет Microsoft.AspNet.WebApi.Client 5.2.6 в проект .net framework 4.6.1, nuget также добавит зависимость Newtonsoft.Json (>= 6.0.4) в .net framework 4.5:

введите здесь описание изображения

введите здесь описание изображения

Проверьте этот документ для более подробной информации.

person Leo Liu-MSFT    schedule 11.10.2018