Другое

Исправление: ошибка несовместимых фреймворков при dotnet add package

Решение вводящих в заблуждение ошибок совместимости фреймворков в .NET CLI, когда пакеты NuGet не кэшированы. Узнайте шаги по устранению неполадок и решения.

Почему команда dotnet add завершается с ошибкой “Package is incompatible with ‘all’ frameworks in project” (Пакет несовместим со всеми фреймворками в проекте), когда пакет отсутствует в папке кэша NuGet?

Я столкнулся с проблемой в скрипте PowerShell, который использует команду dotnet add для установки пакетов NuGet. Скрипт работает корректно, когда пакет уже присутствует в пользовательской папке кэша NuGet (C:\<USER>\.nuget\packages), но завершается с ошибкой “Package is incompatible with ‘all’ frameworks in project”, когда пакет не закэширован.

Используемый мной скрипт PowerShell:

powershell
dotnet add "$projectFilePath" package "$packageName" --source "$dorsetIcsSourceName" --version "$latestPackageVersion"

Переменные:

  • $projectFilePath: путь к файлу проекта
  • $packageName: имя пакета NuGet
  • $dorsetIcsSourceName: имя локального источника пакетов (Azure DevOps Artifacts)
  • $latestPackageVersion: версия пакета для установки

Я нашел обходной путь:

  1. Установить пакет через Visual Studio (что добавляет его в кэш и создает PackageReference)
  2. Удалить PackageReference из файла .csproj
  3. Запустить скрипт PowerShell, который затем работает корректно

Я пробовал запускать команду непосредственно в PowerShell и командной строке, как с правами администратора, так и без них, но проблема сохраняется. Я также тестировал как с локальными, так и с общедоступными пакетами NuGet, и поведение одинаковое.

Сообщение об ошибке кажется вводящим в заблуждение, поскольку пакеты на самом деле совместимы с фреймворками проекта, что доказано тем, что их можно установить через Visual Studio и они работают корректно после кэширования.

Существует ли способ получить более подробный вывод от команды dotnet add для диагностики проблемы? Или это, скорее всего, проблема с правами доступа при создании папки кэша пакетов из командной строки?

Содержание

Понимание ошибки

Ошибка “Пакет несовместим со всеми платформами в проекте” часто появляется как общее сообщение по умолчанию, когда NuGet сталкивается с проблемами при разрешении пакетов, которые мешают ему правильно оценить совместимость. Как отмечено во многих проблемах на GitHub, эта ошибка может возникать даже тогда, когда реальная проблема связана с доступом к источнику пакетов, разрешениями кэша или обнаружением платформы, а не с фактическими проблемами совместимости.

Когда пакет отсутствует в локальном кэше, NuGet пытается скачать его из настроенных источников. Если на каком-либо этапе этот процесс завершается неудачей, система может по умолчанию выдать ошибку совместимости платформы, а не предоставлять более конкретную диагностическую информацию о корневой причине.


Распространенные причины и решения

1. Проблемы с HTTP-кэшем

Когда пакеты не кэшированы, NuGet полагается на HTTP-запросы к удаленным источникам. Несколько факторов могут помешать этому процессу:

  • Проблемы с сетевым подключением к вашему источнику Azure DevOps Artifacts
  • Проблемы аутентификации с частным источником пакетов
  • Конфигурации HTTP-прокси, блокирующие запросы NuGet
  • Правила брандмауэра, препятствующие исходящим подключениям

Решение: Проверьте подключение к источнику пакетов и убедитесь в правильности учетных данных аутентификации. Вы также можете временно использовать флаг --no-http-cache, чтобы обойти проблемы с HTTP-кэшем.

2. Приоритет и конфигурация источника пакетов

Локальные источники пакетов, такие как Azure DevOps Artifacts, иногда имеют проблемы конфигурации, которые мешают правильному разрешению. Ошибка может возникнуть, если NuGet не может получить доступ к источнику или если есть конфликты между несколькими настроенными источниками.

Решение: Проверьте конфигурацию источника пакетов в файле nuget.config и убедитесь, что источник Azure DevOps Artifacts правильно настроен и доступен.


Подробное ведение журнала для диагностики

Вы можете получить подробную диагностическую информацию, добавив флаг детализации в команду:

powershell
dotnet add "$projectFilePath" package "$packageName" --source "$dorsetIcsSourceName" --version "$latestPackageVersion" --verbosity diagnostic

Доступные уровни детализации:

  • quiet - минимальный вывод
  • minimal - уровень по умолчанию
  • normal - стандартная информация
  • detailed - более подробная информация
  • diagnostic - полная диагностическая информация

Уровень diagnostic покажет вам:

  • Попытки разрешения пакетов
  • Запросы и ответы источников
  • Операции с кэшем
  • Процесс обнаружения платформы
  • Любые ошибки аутентификации или разрешений

Этот подробный вывод поможет точно определить, где происходит сбой - при доступе к источнику, операциях с кэшем или оценке совместимости.


Управление кэшем

Очистка и управление кэшем

Как упоминается во многих ответах на Stack Overflow, очистка кэша NuGet является распространенным шагом для устранения неполадок:

powershell
dotnet nuget locals all --clear

Это очищает:

  • Глобальную папку пакетов
  • HTTP-кэш запросов
  • Временные файлы кэша

Расположения папок кэша

NuGet использует несколько папок кэша, которые могут потребовать ручного внимания:

  • Глобальные пакеты: C:\Users\<USER>\.nuget\packages
  • HTTP-кэш: C:\Users\<USER>\.nuget\http-cache
  • Временный кэш: C:\Users\<USER>\.nuget\temp

Если у этих папок есть проблемы с разрешениями, NuGet может не иметь возможности создавать или получать к ним доступ должным образом.


Проблемы с разрешениями и доступом

Разрешения папок

Ваш обходной путь установки через Visual Studio в первую очередь указывает на проблему с разрешениями. Visual Studio обычно запускается с повышенными разрешениями или в другом контексте пользователя по сравнению с выполнением из командной строки.

Проверьте эти разрешения:

  • Убедитесь, что пользователь, запускающий скрипт PowerShell, имеет право на запись в папки кэша NuGet
  • Проверьте сетевой доступ к вашему источнику Azure DevOps Artifacts
  • Убедитесь, что антивирусное ПО не блокирует операции NuGet

Повышенные привилегии

Попробуйте запустить PowerShell от имени администратора, чтобы проверить, связана ли проблема с разрешениями пользователя:

powershell
Start-Process powershell -Verb RunAs

Конфигурация источника пакетов

Аутентификация источника

Для Azure DevOps Artifacts убедитесь, что ваша аутентификация настроена правильно. Возможно, вам потребуется:

  1. Очистить сохраненные учетные данные для источника пакетов
  2. Повторно пройти аутентификацию с помощью процесса входа в Azure DevOps
  3. Использовать персональные токены доступа вместо аутентификации Windows

Приоритет источника

Проверьте, настроено ли несколько источников пакетов, и убедитесь, что ваш источник Azure DevOps имеет соответствующий приоритет. Вы можете просматривать и настраивать источники с помощью:

powershell
dotnet nuget list source

Проблемы с обнаружением платформы

Иногда ошибка возникает потому, что .NET CLI не может правильно определить целевые платформы проекта. Это может произойти, если:

  • Файл .csproj содержит некорректные ссылки на платформы
  • Есть несколько целевых платформ с конфликтующими требованиями
  • Проект использует неподдерживаемую версию платформы

Решение: Проверьте конфигурацию платформы вашего проекта, проверив свойства <TargetFramework> или <TargetFrameworks> в файле .csproj.


Заключение

Ошибка “несовместим со всеми платформами”, с которой вы столкнулись, вероятно, является симптомом лежащих в основе проблем, а не фактических проблем совместимости. Исходя из вашего успешного обходного пути и результатов исследования, вот ключевые шаги для решения этой проблемы:

  1. Используйте подробное ведение журнала с --verbosity diagnostic, чтобы получить подробную диагностическую информацию о том, где происходит сбой процесса
  2. Проверьте разрешения для папок кэша NuGet и убедитесь, что у выполняющего пользователя есть соответствующий доступ
  3. Очистите кэш NuGet с помощью dotnet nuget locals all --clear, чтобы устранить любые поврежденные записи кэша
  4. Проверьте конфигурацию источника пакетов и аутентификацию для вашего источника Azure DevOps Artifacts
  5. Проверьте доступность пакетов, вручную скачав пакет из вашего источника, чтобы убедиться в сетевом подключении

Если проблема сохраняется, рассмотрите возможность создания минимального воспроизводимого случая и сообщения о нем в репозитории NuGet на GitHub, так как это известная проблема, которая может потребовать расследования со стороны команды NuGet.

Источники

  1. Stack Overflow - Unable to install packages using dotnet add package
  2. GitHub Issue - Package ‘NameOfPackage’ is incompatible with ‘all’ frameworks
  3. Microsoft Learn - Managing NuGet cache folders
  4. Microsoft Learn - dotnet nuget locals command
  5. Stack Overflow - Error NU1100: Unable to resolve
  6. Microsoft Q&A - There are no versions available for the package
Авторы
Проверено модерацией
Модерация