При добавлении пакета в манифест проектакаждый проект Unity имеет манифест проекта, который действует как точка входа для диспетчера пакетов. Этот файл должен находиться в каталоге
. Диспетчер пакетов использует его для настройки многих вещей, включая список зависимостей для этого проекта, а также любой репозиторий пакетов для запроса пакетов. Дополнительная информация
См. в Словарь, Unity считает этот пакет зависимость
См. в Словарь проекта (прямая зависимость). Однако пакет также может иметь зависимости от других пакетов, которые создают косвенные зависимости в любых проектах, которым требуется этот пакет.
Поскольку для разработки игр и приложений большинству проектов требуется более одного пакета, диспетчер пакетов должен оценить все запрошенные версии пакетов для извлечения из реестра (будь то прямые или косвенные) и решить, какие из этих версий пакетов следует использовать. установить. Для этого он вычисляет набор пакетов, который удовлетворяет всем прямым и косвенным зависимостям в проекте, начиная с зависимостей проекта и рекурсивно исследуя каждую косвенную зависимость, собирая все информацию о зависимостях, а затем выбирает набор пакетов, который удовлетворяет требованиям зависимостей без каких-либо конфликтов. Например, этот граф зависимостей представляет проект с четырьмя прямыми зависимостями и всеми их косвенными зависимостями:
В этом примере:
- Голубые узлы обозначают прямые зависимости проекта.
- Темно-синие узлы показывают тот же пакет и версию, что и непрямые зависимости в этом проекте.
- Красные узлы показывают две разные версии одного и того же пакета, что является конфликтом.
Примечание. Необходимо разрешать только зависимости пакетов, объявленные с версиями. Диспетчер пакетов выбирает пакеты, установленные из других источников, таких как встроенные пакеты
См. в Словарь и зависимости, объявленные с помощью локальные пути, URL-адреса Git и встроенные пакеты в зависимости от версии .
Выбор лучшего решения
В зависимости от набора пакетов, определенных в манифесте проекта, оценка всех возможных комбинаций пакетов может занять много времени: потенциально проект может зависеть от сотен пакетов, каждый из которых зависит от сотен других пакетов, наиболее требовательных к разные версии.
Блокировка файлов и стратегия разрешения
Чтобы обеспечить наиболее эффективное решение, диспетчер пакетов отдает приоритет версиям пакетов, которые он ранее использовал, отслеживая их в файле блокировки. Это гарантирует, что последующее разрешение зависимостей с использованием одних и тех же входных данных приведет к тем же самым выходным данным. Это также сводит к минимуму трудоемкие операции, такие как загрузка, извлечение или копирование пакетов.
Иногда диспетчер пакетов не может найти решение, включающее только заблокированные пакеты. В этом случае диспетчер пакетов использует решение с наименее рискованными обновлениями, предпочитая обновления исправлений незначительным или основным обновлениям, а также по умолчанию незначительные обновления основным обновлениям. Однако вы можете настроить степень агрессивности диспетчера пакетов при рассмотрении более новой версии с помощью свойства resolutionStrategy.
Пример
В этом примере запрошено несколько версий следующих пакетов:
-
burst@1.2.2
(дважды) иburst@1.3.0-preview.3
-
collections@0.5.1-preview.11
иcollections@0.5.2-preview.8
-
jobs@0.2.4-preview.11
(дважды) иjobs@0.2.5-preview.20
Используя набор прямых и косвенных зависимостей, диспетчер пакетов выбирает самую старшую версию пакетного пакета ( burst@1.3.0-preview.3
), который удовлетворяет зависимости пакета collections@0.5.2-preview.8
:
- В Unity добавлен новый решатель зависимостей пакетов (SAT). 2019.4 NewIn20194