Введение в детерминистические построения
Детерминизм сборки важен, если вы хотите иметь возможность повторить процесс сборки и получить один и тот же набор бинарных файлов. Создание детерминистической сборки обеспечивает соответствие нормативным требованиям для отраслей, требующих проверки бинарных файлов, и является полезным способом обеспечения того, чтобы пользователи не загружали неизменное содержимое. Детерминистические сборки облегчают обнаружение несанкционированных изменений, а также позволяют отслеживать ошибки до их точного состояния кода и ассетов.
Понимание недетерминистических построений
Недетерминистические сборки могут происходить в следующих ситуациях:
- Во время импорта и преобразования ассетов: Недетерминистические построения могут происходить, когда Unity импортирует исходные ассеты и конвертирует их в internal format, или когда Unity конвертирует импортируемые ассеты в пакетные ассеты, такие как AssetBundles.
- Сценарии редактора, которые собирают или модифицируют ресурсы во время сборки: Недетерминистические сборки могут происходить, если, например, инструменты или пользовательские постпроцессоры автоматически собирают ресурсы проекта и назначают их полям сериализированного массива внутри ScriptableObject. Если порядок объектов в этом массиве явно не сортируется, сериализированные данные могут отличаться между машинами или последовательными сборками.
Создание последовательности среды
Наиболее распространенной причиной недетерминированных сборок являются несоответствия в среде. Чтобы обеспечить согласованность среды, рассмотрите следующие вопросы:
Последовательные среды машин сборки: Обеспечение последовательности операционной системы и архитектуры CPU на всех машинах сборки. Поведение округления с плавающей запятой различается между архитектурами, что может изменить серийные значения с плавающей запятой, особенно в AnimationClips или импортированных данных Mesh.
Последовательные цепи инструментов: Используйте одну и ту же версию Unity Editor, версию Xcode и цепи инструментов для всех сборок. Небольшие изменения сериализации между версиями Unity могут изменить расположение байтов AssetBundle.
-
Отключить автоматическое преобразование новых строк в Git: Windows и macOS кодируют окончания строк по-разному, и автоматическое преобразование строк изменяет хэш файла и нарушает детерминизм. Чтобы отключить автоматическое преобразование, запустите следующую команду git:
git config --global core.autocrlf false
Использование сервера кэша для сохранения детерминизма
Для достижения детерминистических сборок в Unity наиболее эффективным методом является принуждение всех машин к совместному использованию идентичных импортированных ассетов через Unity Ускоритель.
Когда несколько разработчиков подключаются к одному и тому же удаленному ускорителю, каждая машина повторно использует те же импортированные артефакты вместо повторного импортирования локально.
Ускоритель Unity имеет следующие ограничения:
- Он кэширует только импортированные ассеты.
- Он не кэширует встроенные AssetBundles или адресуемые артефакты сборки.
- Преимущество детерминизма применяется к последовательности импорт-время, а не к повторному использованию AssetBundle.