Два значения в объявлении — URL и checksum — должны соответствовать одному архиву
Для удалённого binaryTarget в Package.swift связаны URL архива и checksum; Apple описывает их как параметры декларации бинарной цели. Поэтому при несовпадении сначала проверьте, что скачанный ZIP получен именно по этому адресу и не был заменён, а затем пересчитайте checksum для точного файла и исправьте декларацию. Если архив перепаковали, выпустите новый неизменяемый артефакт и обновите версию пакета. Очистка кэша сама по себе это расхождение не исправляет. Документация Apple о параметрах binaryTarget.
Эта статья предназначена для трёх групп:
- разработчиков приложений с удалённым XCFramework, которым нужно отличить ошибку декларации от смены скачиваемого файла;
- сопровождающих Swift-пакеты, которые публикуют бинарные зависимости и отвечают за неизменность архивов;
- разработчиков, проверяющих CI или удалённую сборку Xcode и выясняющих, воспроизводится ли ошибка с тем же коммитом.
Последнее обновление — 8 октября 2026 года; сведения сверены с документацией Apple по checksum и примечаниями к выпуску Xcode 27. Одиночный сбой не является доказательством общей неисправности Xcode 27: сначала необходимо установить, на каком этапе и для какого файла он возник.
Как локализовать ошибку до изменения проекта
Сообщение о checksum указывает на проблему проверки удалённого бинарного архива, но само по себе не говорит, почему файл не совпал с ожидаемым значением. Не начинайте с правки Package.resolved, очистки всех кэшей или повторного создания сертификатов: эти действия не установят, какой файл был получен.
Сначала сохраните исходные данные:
- полный текст ошибки из Xcode или журнала сборки;
- коммит приложения и выбранную версию Swift-пакета;
- соответствующий фрагмент
Package.swiftс именемbinaryTarget, URL и объявленным checksum; - результат разрешения зависимостей, если проект его фиксирует;
- ZIP, полученный при неудачной сборке, и сведения о запросе: исходный URL, конечный адрес после перенаправления и время загрузки.
Затем определите, в каком именно месте оборвался процесс:
- Сбой разрешения исходного пакета. Swift Package Manager не смог разрешить репозиторий или версию. Это не то же самое, что checksum удалённого бинарного target.
- Ошибка checksum бинарного архива. Загрузка дошла до проверки, но полученный архив не соответствует значению в декларации.
- Ошибка после проверки. Пакет разрешён и архив принят, однако компилятор или линковщик сообщает о несовместимости платформы, архитектуры либо API. В этом случае переписывать checksum без доказательств не следует.
Apple описывает checksum именно как проверку удалённого бинарного target; целевой объект проверки — архив, а не распакованное содержимое XCFramework. Это различие важно: ZIP может не совпадать, хотя находящийся внутри фреймворк выглядит знакомо. И наоборот, успешная проверка архива не гарантирует успешную последующую сборку. Описание checksum для target.
Разработчику приложения: сопоставьте декларацию с полученным ZIP
В Package.swift проверьте, что binaryTarget ссылается на ожидаемый артефакт: правильны ли имя, URL и версия зависимости, которую разрешил проект. Имя target помогает связать декларацию с зависимостью, но вычислять контрольную сумму нужно не для имени, каталога после распаковки или произвольного файла из него.
Скачайте артефакт по URL, указанному в декларации, и сохраните полученный ZIP до любых очисток или повторных попыток. Если сервер выполняет перенаправление, запишите конечный адрес. Сам факт, что загрузка завершилась, не подтверждает, что ответ содержит нужный архив: по тому же адресу могла появиться новая публикация, файл-заглушка или другой вариант сборки.
Для проверки checksum используйте рекомендованную Apple команду и путь к фактическому архиву:
swift package compute-checksum путь/к/архиву.zip
Команда должна получить тот ZIP, который распространяется по URL, а не распакованный каталог .xcframework. Сверьте её результат со значением в Package.swift. Apple приводит swift package compute-checksum как способ вычислить контрольную сумму архива; подробности о назначении значения приведены в документации checksum.
Если результат совпал с декларацией, но проект всё равно не собирается, сохраните эту проверку как доказательство и переходите к диагностике следующего этапа — например, совместимости содержимого XCFramework. Если результат отличается, пока не меняйте checksum наугад: сначала выясните, был ли скачан правильный файл и соответствует ли он версии зависимости.
Автору бинарного пакета: проверьте публикацию и неизменность артефакта
Для сопровождающего пакета ключевой вопрос — менялся ли файл после вычисления checksum. При создании публикации архив могли пересобрать или повторно упаковать; файл по уже выпущенному URL могли заменить; ветка или окружение публикации могли загрузить не тот артефакт. Любой такой случай требует сравнить фактический ZIP с тем, который использовался при подготовке manifest.
Порядок проверки:
- найдите исходный архив, который должен соответствовать версии пакета;
- убедитесь, что URL из нужной версии
Package.swiftприводит к ожидаемому файлу; - скачайте опубликованный ZIP и вычислите checksum именно для него;
- сопоставьте вычисленное значение с декларацией и сохранённым файлом сборки;
- проверьте, не использует ли другая версия или ветка тот же изменяемый URL;
- при несовпадении подготовьте новый артефакт и новую версию, сохранив доступ к старой публикации для существующих потребителей.
Если после публикации архив оказался другим, безопаснее выпустить новую версию пакета, чем незаметно подменять файл по прежнему адресу. У потребителей могут оставаться зафиксированные версии и результаты разрешения зависимостей; замена содержимого без обновления версии превращает одну декларацию в ссылку на разные файлы в разное время. В такой ситуации новые проекты и уже существующие сборки могут вести себя неодинаково.
Для повторяемого процесса связывайте генерацию XCFramework, упаковку, вычисление checksum, загрузку файла и изменение manifest одной проверяемой процедурой. Apple отдельно рассматривает распространение бинарных фреймворков как Swift-пакетов и создание многоплатформенного бинарного bundle: эти материалы полезны для проверки границы между готовым фреймворком и публикуемым архивом. См. руководство по распространению бинарных фреймворков и описание создания многоплатформенного бинарного bundle.
Сопровождающему CI: докажите, какой файл получил runner
Локальная проверка не подтверждает, что удалённая машина получила тот же артефакт. У локальной и удалённой сборки могут различаться зафиксированный коммит, выбранная версия пакета, состояние разрешения зависимостей или фактический ответ URL. Кроме того, сетевой маршрут или прокси могут изменить то, какой ресурс приходит по адресу. Это направления проверки, а не утверждение, что именно такой сбой обязательно происходит в Xcode 27.
Для сравнения двух окружений соберите одинаковые диагностические сведения: коммит приложения, объявленную версию Swift-пакета, URL из binaryTarget, фактический адрес после перенаправления, сам скачанный архив и вывод swift package compute-checksum. Сравнивайте файл, а не только имя ZIP: одинаковое имя не доказывает одинаковое содержимое.
Затем проверьте, использует ли задание ожидаемый коммит и актуальное состояние зависимостей. В документации Apple по сборке Swift-пакетов и приложений в CI рассматривается работа с зависимостями в непрерывной интеграции. Если проект использует облачное окружение, отдельно сверяйте доступность зависимостей по правилам этой среды, не смешивая отказ доступа с checksum: документация Apple о зависимостях в Xcode Cloud.
Исправление считается подтверждённым не тогда, когда одна локальная попытка прошла, а когда тот же зафиксированный коммит в чистом окружении получает ожидаемый архив, вычисляет checksum, совпадающий с manifest, и продолжает сборку без ошибки проверки. Если после этого появляется компиляционная ошибка, фиксируйте её отдельно: она уже не доказывает, что checksum неверен.
Список приёмки перед изменением checksum
Используйте этот список до выпуска исправления или очистки кэша:
- [ ] Зафиксированы текст ошибки, коммит приложения и версия зависимости.
- [ ] Проверено, что ошибка возникает при проверке бинарного архива, а не при разрешении исходного пакета или последующей компиляции.
- [ ] Найдено объявление
binaryTarget; сохранены его URL и checksum. - [ ] Сохранён ZIP, скачанный из указанного URL, вместе с конечным адресом после перенаправлений.
- [ ] Установлено, что вычисление выполняется для ZIP-архива, а не для каталога XCFramework.
- [ ] Результат
swift package compute-checksumсравнен с декларацией. - [ ] Если файл по URL менялся, подготовлена новая версия пакета вместо скрытой замены старого артефакта.
- [ ] На CI или удалённой Mac-сборке проверены тот же коммит и тот же ожидаемый файл.
- [ ] После подтверждённого исправления сборка повторена в чистом окружении; диагностический журнал сохранён.
Очистка кэша может быть уместна только после фиксации исходного состояния и проверки корректного артефакта, например если есть основание подозревать, что окружение использует ранее полученный файл. Она не меняет содержимое опубликованного ZIP и не приводит значение в manifest в соответствие с новым архивом. Поэтому считать её универсальным способом ремонта нельзя.
Ответы на частые вопросы
Почему checksum в Swift Package отличается от скачанного ZIP?
Сравнивать нужно checksum из Package.swift с результатом вычисления для точного ZIP-файла, который загружен по объявленному URL. Если URL теперь отдаёт другой архив, файл был перепакован или фактический адрес после перенаправления ведёт к иной публикации, расхождение ожидаемо. Сохраните архив и сведения о запросе, прежде чем менять manifest или очищать кэш.
Для какого файла binaryTarget вычисляют checksum?
Для архива, доступного по URL из объявления binaryTarget, а не для распакованного каталога XCFramework и не для отдельного бинарного файла внутри него. Получите именно распространяемый архив и используйте swift package compute-checksum с путём к этому файлу. Затем сопоставьте результат с checksum в manifest и проверьте, что опубликован тот же архив.
Что проверить, если после обновления бинарной зависимости Xcode 27 всё ещё сообщает об ошибке?
Сначала подтвердите версию зависимости и архив, на который указывает её manifest; простое изменение версии в проекте не доказывает, что сервер раздаёт новый файл. Если архив и checksum уже согласованы, проверьте результат разрешения зависимостей и повторите сборку в чистом окружении. Удалять кэш стоит только после сохранения исходного лога и фиксации ожидаемого URL.
Как подтвердить, что удалённая сборка получила нужный архив?
Зафиксируйте коммит проекта, версию пакета, URL из декларации и фактический адрес запроса после перенаправлений. Сохраните скачанный ZIP в качестве артефакта диагностики и вычислите checksum именно на удалённой машине. Сравните эти данные с локальной проверкой: если архивы отличаются, сначала исследуйте публикацию, прокси или подмену URL, а не меняйте код приложения.
Сравнение вариантов для повторяемого исправления
| Вариант | Когда уместен | Что нужно подтвердить | Основной риск |
|---|---|---|---|
| Исправить checksum для опубликованного ZIP | Архив по URL намеренно не менялся, а декларация содержит неверное значение | Вычисленный checksum относится к точному распространяемому файлу | Ошибка повторится, если ZIP заменят после проверки |
| Выпустить новую версию с новым архивом | Архив перепакован, заменён или должен измениться | Новые URL, архив, checksum и версия связаны между собой | Потребители останутся на старой версии, пока явно не обновят зависимость |
| Очистить кэш без проверки публикации | Только если подтверждена проблема локального состояния кэша | Новый запрос действительно получает правильный архив | Причина расхождения останется и проявится в другой чистой сборке |
| Оставить manifest прежним и исправить сетевой маршрут | Файл на сервере верен, но окружение получает другой ресурс | В локальной и удалённой сборке сопоставлены URL и скачанные ZIP | Изменение зависимостей замаскирует проблему сети или прокси |
Для команд с несколькими пакетами полезно установить строгую связь между версией, manifest и архивом. Таблица ниже помогает выбрать минимально достаточное действие и определить, какие данные необходимо сохранить до публикации исправления.
| Наблюдение | Ответственный участок | Следующее действие | Критерий приёмки |
|---|---|---|---|
| ZIP правильный, его checksum отличается от manifest | Публикация пакета | Проверить исходную декларацию и выпустить согласованную версию | Контрольная сумма точного ZIP совпадает с manifest |
| Локальный архив соответствует manifest, удалённый — нет | CI или маршрут загрузки | Сопоставить URL, перенаправления, коммит и сохранённые файлы | Чистая удалённая сборка получила ожидаемый архив |
| Checksum совпадает, но компиляция завершается ошибкой | Интеграция XCFramework | Диагностировать платформы, архитектуры и содержимое фреймворка отдельно | Ошибка классифицирована как этап после проверки архива |
| Один URL раздаёт разные архивы для версий или веток | Процесс выпуска | Перевести публикации на адреса, соответствующие неизменяемым версиям | Старые проекты по-прежнему получают прежний артефакт |
Если проект уже располагает подходящей macOS-средой, локальная проверка может быть достаточной; отдельная машина не нужна только ради самого факта наличия checksum-ошибки. Но когда у команды нет доступного Mac с нужным Xcode, текущий обходной путь без Mac не позволит проверить полноценную сборку и получить диагностику из целевого инструментария. Покупка собственного Mac даёт постоянную локальную среду, но требует единовременных затрат, обслуживания и места для установки; она разумнее при постоянной нагрузке или необходимости подключать физические устройства.
Для временной проверки релиза, воспроизведения ошибки в чистой macOS-среде или поддержки регулярно работающего runner удалённый Mac может быть практичнее покупки оборудования. У него также есть ограничения: результат зависит от сетевого доступа, передачи артефактов и настроек среды, а при необходимости физически подключать устройство удалённая машина может не подойти. Поэтому сначала определите, требуется ли проекту именно временная проверка на Mac или постоянная собственная инфраструктура.
При отсутствии локальной среды можно изучить доступные варианты удалённого Mac от RUVCLOUD и сверить условия на странице тарифов RUVCLOUD. Перед выбором подготовьте воспроизводимый проект, зафиксированный коммит и безопасный способ передать артефакт; затем оцените, подходит ли удалённая сборка именно для проверки загрузки и checksum. Если задача требует физического подключения устройств или постоянной высокой нагрузки, локальный Mac может оказаться более подходящим решением.