Фон:
Я создал библиотеку с многоцелевым таргетингом, которая нацелена на 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
исчезли.