Пакеты библиотек многоцелевого назначения .NETStandard не восстанавливаются при сборке - PullRequest
0 голосов
/ 08 июля 2019

Фон:

Я создал библиотеку с многоцелевым таргетингом, которая нацелена на net40, net462 и netstandard2.0.Цель этой библиотеки - обернуть StackExchange.Redis и некоторую связанную логику переподключения.Для net40 мне нужно использовать более старую версию пакета, чем новые цели.Вот мой csproj файл:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net40;net462;netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="StackExchange.Redis">
      <Version>2.0.513</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net462'">
    <PackageReference Include="StackExchange.Redis">
      <Version>2.0.513</Version>
    </PackageReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net40'">
    <PackageReference Include="StackExchange.Redis.StrongName">
      <Version>1.1.608</Version>
    </PackageReference>
  </ItemGroup>

</Project>

Обычно эта библиотека работает и может использоваться приложениями на разных целевых платформах.


Проблема:

Проблема, с которой я столкнулся сейчас, заключается в попытке восстановить пакеты nuget для этого проекта.

  • При сборке в Visual Studio

    • Я получаюНесколько примеров этой ошибки исходили из проектов, которые косвенно ссылаются на мой проект с несколькими целями:

      Сборка восстановила пакеты NuGet.Снова соберите проект, чтобы включить эти пакеты в сборку.Для получения дополнительной информации см. http://go.microsoft.com/fwlink/?LinkID=317568.

    • Я также получил много других примеров этой ошибки из различных проектов, которые прямо или косвенно ссылаются на мою библиотеку многоцелевого назначения.{Identifier} и {Namespace} различаются, некоторые относятся к сущностям в моей библиотеке многоцелевого назначения, некоторые относятся к сущностям в проектах, которые зависят от этого.

      CS0234 Имя типа или пространства имен '{Identifier} 'не существует в пространстве имен' {Namespace} '(вам не хватает ссылки на сборку?)

    • Если я строю второй раз, как подсказывает первая ошибка,Я получаю те же ошибки.

  • Если щелкнуть правой кнопкой мыши решение в Solution Explorer и выбрать Восстановить пакеты Nuget после сборки ничего не делает и говорит: Все пакеты уже установлены и восстанавливать нечего.

  • Если я выберу Инструменты> NugetДиспетчер пакетов> Консоль диспетчера пакетов и введите команду dotnet restore, после чего сборка будет работать без ошибок.

Этот проект является единственным в решении, использующем многоцелевой таргетинг.и справочный формат пакета csproj <PackageReference>.

Мне нужно восстановить пакеты, чтобы интегрировать их в мою сборку, чтобы

  • Мне не нужно было объяснять коллегам, как обойти это с помощью Консоль диспетчера пакетов .
  • Я могу построить это решение с помощью сторонних инструментов, таких как TeamCity, без дополнительной настройки.

Неудачные попытки:

Вот несколько вещей, которые у меня естьдо сих пор пробовал:

  • Добавлено dotnet restore как событие предварительной сборки проекта.Это ничего не делает.
  • Использовало События сборки решения Visual Studio для запуска dotnet restore в качестве события предварительной сборки решения.Это работает локально, но это расширение, как правило, ненадежно и не поможет со сторонними сборками, такими как TeamCity.
  • Обновите файл csproj, чтобы использовать более старый формат ссылки на пакет с файлом packages.config.Это привело к множеству новых ошибок сборки.

Обновления

  • Из командной строки я получаю сотни CS0246 ( Типимя пространства имен 'Foo' не может быть найдено (вам не хватает директивы using или ссылки на сборку?) ) и ошибок CS0234, некоторые даже ссылаются на типы в библиотеках базовых классов, таких как System.Net.Использование переключателя -restore, похоже, не меняет этого.Возможно, я что-то упускаю из-за количества выходных данных.

  • Вот минимальный пример, демонстрирующий похожее поведение https://github.com/JamesFaix/RestoreFailExample Он генерирует одну ошибку CS0246, которая являетсянемного отличаетсяЭто также все еще терпит неудачу, когда я пытаюсь dotnet restore в консоли диспетчера пакетов.

  • Я использую VS 15.9.9


Я попробовал решение @Martin Ulrich.Казалось, что это не работает без обновления ссылок в моих файлах csproj и удаления файлов package.config.Для этого я использовал встроенное преобразование Visual Studio из старого формата в формат PackageReference.

Это немного меняет мои ошибки. Пример репо, который я разместил, вероятно, не достаточно сложен. Я сейчас получаю много

Не удалось найти {папка проекта} \ packages.config. Убедитесь, что в этом проекте установлен Microsoft.Bcl.Build и рядом с файлом проекта находится файл packages.config. ,

несколько

Этот проект ссылается на пакеты NuGet, которые отсутствуют на этом компьютере. Используйте NuGet Package Restore, чтобы загрузить их. Для получения дополнительной информации см. http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует файл {путь к проекту} \ packages \ Microsoft.Bcl.Build.1.0.21 \ build \ Microsoft.Bcl.Build.targets.

и несколько CS0246 ошибок, которые я получал раньше.

Ошибки CS0234 исчезли.

1 Ответ

3 голосов
/ 09 июля 2019

Вы ссылаетесь на проект на основе PackageReference из классического файла csproj.

Это по умолчанию означает, что вам нужно вручную устанавливать пакеты nuget в классический проект, так как он не использует транзитивное поведение PackageReference.

Чтобы обойти эту проблему, вы можете добавить следующее к <PropertyGroup> вашего классического файла csproj:

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...