Разрешение ошибочных зависимостей для многоцелевого пакета NuGet - PullRequest
0 голосов
/ 10 октября 2018

Меня смущает то, как разрешаются зависимости при использовании спецификации зависимостей на основе группы в 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>

Этот пакет является многоцелевым пакетом со спецификацией зависимости на основе группы, которая выглядит так, когда я получаю ее прямо из *Файл 1019 *, полученный путем открытия файла 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 содержит:

  • net40
  • net45
  • nestandard2.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).

1 Ответ

0 голосов
/ 11 октября 2018

Разрешение ошибочных зависимостей для многоцелевого пакета NuGet

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

Специализация NuGet - проверка совместимости (если пакеты созданы правильно). NuGet знает, что доступны следующие платформы: v3.5, v4.0, v4.6 и netstandard1.3. «Ближайший» совместимый фреймворк с v4.5 - это v4.0, поэтому он выберет ресурсы v4.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:

enter image description here

enter image description here

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

...