Исправление: ошибка несовместимых фреймворков при 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:
dotnet add "$projectFilePath" package "$packageName" --source "$dorsetIcsSourceName" --version "$latestPackageVersion"
Переменные:
$projectFilePath: путь к файлу проекта$packageName: имя пакета NuGet$dorsetIcsSourceName: имя локального источника пакетов (Azure DevOps Artifacts)$latestPackageVersion: версия пакета для установки
Я нашел обходной путь:
- Установить пакет через Visual Studio (что добавляет его в кэш и создает PackageReference)
- Удалить PackageReference из файла .csproj
- Запустить скрипт 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 правильно настроен и доступен.
Подробное ведение журнала для диагностики
Вы можете получить подробную диагностическую информацию, добавив флаг детализации в команду:
dotnet add "$projectFilePath" package "$packageName" --source "$dorsetIcsSourceName" --version "$latestPackageVersion" --verbosity diagnostic
Доступные уровни детализации:
quiet- минимальный выводminimal- уровень по умолчаниюnormal- стандартная информацияdetailed- более подробная информацияdiagnostic- полная диагностическая информация
Уровень diagnostic покажет вам:
- Попытки разрешения пакетов
- Запросы и ответы источников
- Операции с кэшем
- Процесс обнаружения платформы
- Любые ошибки аутентификации или разрешений
Этот подробный вывод поможет точно определить, где происходит сбой - при доступе к источнику, операциях с кэшем или оценке совместимости.
Управление кэшем
Очистка и управление кэшем
Как упоминается во многих ответах на Stack Overflow, очистка кэша NuGet является распространенным шагом для устранения неполадок:
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 от имени администратора, чтобы проверить, связана ли проблема с разрешениями пользователя:
Start-Process powershell -Verb RunAs
Конфигурация источника пакетов
Аутентификация источника
Для Azure DevOps Artifacts убедитесь, что ваша аутентификация настроена правильно. Возможно, вам потребуется:
- Очистить сохраненные учетные данные для источника пакетов
- Повторно пройти аутентификацию с помощью процесса входа в Azure DevOps
- Использовать персональные токены доступа вместо аутентификации Windows
Приоритет источника
Проверьте, настроено ли несколько источников пакетов, и убедитесь, что ваш источник Azure DevOps имеет соответствующий приоритет. Вы можете просматривать и настраивать источники с помощью:
dotnet nuget list source
Проблемы с обнаружением платформы
Иногда ошибка возникает потому, что .NET CLI не может правильно определить целевые платформы проекта. Это может произойти, если:
- Файл
.csprojсодержит некорректные ссылки на платформы - Есть несколько целевых платформ с конфликтующими требованиями
- Проект использует неподдерживаемую версию платформы
Решение: Проверьте конфигурацию платформы вашего проекта, проверив свойства <TargetFramework> или <TargetFrameworks> в файле .csproj.
Заключение
Ошибка “несовместим со всеми платформами”, с которой вы столкнулись, вероятно, является симптомом лежащих в основе проблем, а не фактических проблем совместимости. Исходя из вашего успешного обходного пути и результатов исследования, вот ключевые шаги для решения этой проблемы:
- Используйте подробное ведение журнала с
--verbosity diagnostic, чтобы получить подробную диагностическую информацию о том, где происходит сбой процесса - Проверьте разрешения для папок кэша NuGet и убедитесь, что у выполняющего пользователя есть соответствующий доступ
- Очистите кэш NuGet с помощью
dotnet nuget locals all --clear, чтобы устранить любые поврежденные записи кэша - Проверьте конфигурацию источника пакетов и аутентификацию для вашего источника Azure DevOps Artifacts
- Проверьте доступность пакетов, вручную скачав пакет из вашего источника, чтобы убедиться в сетевом подключении
Если проблема сохраняется, рассмотрите возможность создания минимального воспроизводимого случая и сообщения о нем в репозитории NuGet на GitHub, так как это известная проблема, которая может потребовать расследования со стороны команды NuGet.
Источники
- Stack Overflow - Unable to install packages using dotnet add package
- GitHub Issue - Package ‘NameOfPackage’ is incompatible with ‘all’ frameworks
- Microsoft Learn - Managing NuGet cache folders
- Microsoft Learn - dotnet nuget locals command
- Stack Overflow - Error NU1100: Unable to resolve
- Microsoft Q&A - There are no versions available for the package