Симптом: учебный проект завис на «Resolving Package Graph», загрузка не заканчивается или появляется ошибка версии. Быстрое решение: сначала проверьте URL репозитория через браузер или Git, затем изучите сведения о разрешении пакетов в Xcode и только после этого сравните ограничения версий с Package.resolved.

Эта последовательность подходит, если вы впервые добавляете библиотеку в проект SwiftUI, открыли пример преподавателя или работаете на компьютере с ограниченной сетью.

Последнее обновление: 30 августа 2026 года; сведения о Xcode 26.6 и работе с пакетами сверены по официальным примечаниям к выпуску Xcode 26.6 и документации Apple.

Сначала определите, на каком участке возникает ошибка

Swift Package Manager — это встроенный менеджер зависимостей. Проще говоря, он получает для проекта «учебники» нужных версий, проверяет их совместимость и передаёт выбранные продукты компилятору. Если вы видите ошибку загрузки, это ещё не означает, что сломан сам Swift или SwiftUI.

У одной и той же остановки в Xcode могут быть разные причины:

<
Что вы видитеЧто это обычно означаетПервая проверкаКогда остановиться
Репозиторий не открывается или URL отклонёнОшибка адреса, сети или доступаОткрыть адрес в браузере и проверить чтение через GitЕсли домен блокируется политикой сети
Загрузка прерываетсяПрокси, сертификат, нестабильный канал или недоступный хостПовторить чтение без изменения проектаЕсли несколько независимых проверок дают сетевую ошибку
Версии не могут быть согласованыОграничения пакетов конфликтуютСопоставить Package.swift, требования проекта и Package.resolvedЕсли изменение версии ломает учебный код
Пакет загружен, но сборка не проходитОшибка продукта, платформы или исходниковПроверить выбранный продукт и полный текст ошибки компиляцииЕсли ошибка уже относится к Swift-коду, а не к загрузке
Сохраните полный текст ошибки, адрес репозитория, имя проекта и действие, после которого всё началось. Слово «не работает» не помогает отличить сетевую проблему от конфликта версий. Нужны именно строки Xcode и точный URL.

Apple описывает добавление Swift-пакетов, выбор продукта и управление зависимостями в документации по Swift Packages. Не переносите путь из старого видео вслепую: интерфейс и доступные пункты могут зависеть от версии Xcode.

Первая проверка для новичка: публичный пакет и пустой проект

Если вы впервые добавляете библиотеку к курсовой работе, не начинайте с удаления кэшей. Сначала отделите ошибку конкретного проекта от состояния вашего Mac.

Проверьте адрес, а не только название пакета

Скопированный адрес может вести на веб-страницу, подкаталог или текст с лишним пробелом. Для Swift Package Manager нужен адрес Git-репозитория, а не ссылка на отдельную публикацию, файл или инструкцию.

Сделайте так:

  • откройте адрес в браузере и убедитесь, что репозиторий действительно существует;
  • проверьте, что в URL нет кавычек, пробела или лишнего символа;
  • сравните адрес с тем, который указал преподаватель;
  • убедитесь, что выбранный пакет публикует нужный продукт, а не только исходный код;
  • запишите дату и коммит, на который ссылается учебная инструкция, если они указаны.
Для базового понимания удалённого репозитория полезно свериться с [официальным объяснением Git-репозиториев и удалённых адресов](https://docs.github.com/en/get-started/git-basics/about-remote-repositories?utm_source=openai). Здесь важен не сервис, где размещён код, а возможность получить именно тот репозиторий, который ожидает проект.

Повторите добавление в минимальном проекте

Создайте пустой учебный проект без кода курса и добавьте тот же пакет через штатный интерфейс Xcode. Выберите только продукты, которые нужны примеру. Если пакет загружается в пустом проекте, проблема, вероятно, находится в исходном проекте: его требования, зафиксированные версии или выбранные продукты не совпадают.

Если пакет не загружается даже там, сравните браузерную проверку и чтение через Git. Браузер может открыть главную страницу, но это не доказывает, что Xcode сможет получить Git-данные. Обратная ситуация тоже возможна: сайт доступен, а локальное сетевое правило блокирует обращение инструмента разработки.

Различайте разрешение и сборку

Когда Xcode завершил загрузку, но выдаёт ошибку при компиляции, не называйте это сбоем загрузки Swift Package Manager. Проверьте, добавлен ли нужный продукт в target, совпадает ли имя модуля с примером и не требует ли библиотека другую платформу или версию Swift. Документация Package.Dependency объясняет, как пакет объявляет зависимости и ограничения.

Безопасная граница здесь простая: не меняйте одновременно URL, версию и код проекта. Иначе вы не узнаете, какое действие устранило ошибку, а какое создало новую.

Если проект преподавателя использует Package.resolved

При открытии готового проекта часто проблема возникает не во время скачивания как такового, а на этапе согласования набора зависимостей. Package.resolved можно представить как читательский билет: он записывает, какие точные издания библиотек уже выбраны для проекта. Это не список пожеланий и не универсальный файл для замены.

Сравните три источника требований

Проверьте последовательно:

  • зависимости, объявленные в проекте или в Package.swift;
  • ограничения версий, заданные каждой зависимостью;
  • содержимое Package.resolved, включая зафиксированные версии и ссылки;
  • коммит или архив, который использовал преподаватель;
  • сообщение Xcode о пакете, который не удаётся разрешить.
Официальное описание синтаксиса Swift Package Manager находится в [документации Swift PackageDescription](https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html?utm_source=openai). Она помогает понять разницу между требованием «не ниже версии», диапазоном и точной фиксацией, но не подтверждает, что конкретный учебный репозиторий сегодня находится в рабочем состоянии.

Не удаляйте файл как универсальное лекарство

Перед любым изменением скопируйте Package.resolved в отдельную папку и сохраните текущую ветку или коммит. Затем запишите, какие версии были выбраны. Только после этого можно проверить повторное разрешение, если преподаватель прямо рекомендует обновить зависимости.

Переразрешение может исправить ссылку на исчезнувший коммит, но одновременно подобрать более новую связанную библиотеку. Код курса перестанет собираться, хотя первоначальная ошибка загрузки исчезнет. Для учебной работы важнее воспроизводимость, чем самая свежая версия.

**Важно:** если однокурсник сообщает, что «просто удалил Package.resolved и всё заработало», это частный случай, а не правило. Сначала выясните, одинаковы ли у вас коммит проекта, URL пакета, ограничения версий и сетевые условия.

Для школьного компьютера: проверить ограничения без обхода защиты

На компьютере учебного заведения у вас может не быть прав на установку инструментов, изменения сертификатов или настройку прокси. Повторная установка Xcode не исправит блокировку домена и не выдаст вам разрешение, которого нет у учётной записи.

Проведите проверку в таком порядке.

Проверка через браузер

Откройте репозиторий и проверьте, не появляется ли предупреждение о сертификате, авторизации или фильтрации. Если браузер показывает страницу блокировки, сохраните её текст и обратитесь к администратору. Не вводите пароль в неожиданном окне, которое появилось после перехода по незнакомому адресу.

Проверка чтения через Git

Выполните только разрешённую вашей организацией проверку чтения репозитория, не изменяя его и не загружая код обратно. Она должна отвечать на вопрос: может ли рабочая среда получить Git-объект по этому URL. Если Git сообщает о соединении, сертификате или авторизации, это отдельная ветка диагностики, а не повод менять версии пакета.

Проверка журнала Xcode

Посмотрите подробности операции загрузки и сохраните строки с адресом, кодом ответа или причиной отказа. Не публикуйте в открытом чате токены, приватные URL, личные пути и содержимое ключей. Для сетевого сбоя полезен полный текст, но секреты из него нужно удалить перед отправкой преподавателю.

Остановка наступает, когда ограничение подтверждено несколькими способами или администратор прямо запрещает менять настройки. Не отключайте проверку сертификатов, не запускайте неизвестные скрипты и не пытайтесь обходить управление школьным устройством. Корректный вариант — получить разрешённое сетевое окно или продолжить работу на другой контролируемой среде.

Для командного проекта: отделите публичный пакет от приватного

Публичная зависимость должна читаться без прав участника закрытого проекта. Приватная зависимость, наоборот, требует подтверждённой учётной записи и права чтения конкретного репозитория. Эти случаи нельзя исправлять одной и той же настройкой.

Сначала уточните у руководителя проекта:

  • является ли репозиторий открытым или приватным;
  • какой URL считается правильным;
  • какая ветка или фиксация используется;
  • должен ли студент иметь доступ лично;
  • каким способом команда официально подключает зависимости.
HTTPS-учётные данные, SSH-ключ и Package.resolved решают разные задачи. Первые подтверждают личность при обращении к удалённому ресурсу, второй участвует в безопасной аутентификации, а третий фиксирует выбранный набор версий. Ни один из них не заменяет право чтения репозитория.

Проверьте доступ на отдельном тестовом проекте с минимальной зависимостью. Не используйте аккаунт однокурсника, не пересылайте приватный ключ и не вставляйте секреты в Package.swift, скриншоты или сообщения об ошибке. Если команда применяет SSH, следуйте её инструкции и храните ключ только в своей защищённой учётной записи.

Если тестовый репозиторий читается, а рабочий — нет, проблема почти наверняка относится к правам или URL проекта. Если не читается ни один разрешённый репозиторий, возвращайтесь к сетевой и локальной проверке.

Проведите финальную приёмку на одинаковом проекте

Удалённый Mac может быть полезен не как «магическое исправление», а как контрольный стенд. На нём можно проверить, связана ли ошибка с вашей школьной сетью, правами установки или загрязнённой настройками средой. При этом сам репозиторий и правила версий остаются теми же.

Для сравнения используйте:

  • один и тот же коммит проекта;
  • одинаковый URL зависимости;
  • сохранённый вариант Package.resolved;
  • одинаковый выбранный продукт пакета;
  • одинаковую последовательность действий в Xcode.
Сначала выполните первичное разрешение зависимостей. Затем закройте и снова откройте проект, чтобы проверить повторное чтение выбранных версий. После этого запустите сборку и отделите ошибку компилятора от ошибки менеджера пакетов. Такая проверка соответствует рабочему подходу Apple к воспроизводимым сборкам и зависимостям, описанному в [руководстве по пакетам и непрерывной интеграции](https://developer.apple.com/documentation/xcode/building-swift-packages-or-apps-that-use-them-in-continuous-integration-workflows?v=1.1.1&utm_source=openai).

Контрольный список перед решением

  • [ ] Сохранен полный текст ошибки, URL репозитория и коммит проекта.
  • [ ] Адрес репозитория проверен в браузере без лишних символов.
  • [ ] Чтение через Git проверено отдельно от интерфейса Xcode.
  • [ ] Понятно, является ли зависимость публичной или приватной.
  • [ ] Проверены права личной учётной записи, если репозиторий закрытый.
  • [ ] Сопоставлены требования проекта и Package.resolved.
  • [ ] Перед удалением или изменением файла сделана резервная копия.
  • [ ] В пустом проекте выполнена проверка той же публичной зависимости.
  • [ ] В журнале Xcode исключены прокси, сертификат и блокировка домена.
  • [ ] На контрольном Mac использованы тот же коммит и тот же URL.
  • [ ] После разрешения зависимостей отдельно проверена сборка.
  • [ ] Сформулировано условие остановки: исправлять, обратиться к преподавателю или сменить среду.
Если на чистом Mac всё проходит, а школьный компьютер продолжает выдавать сетевую или разрешительную ошибку, не тратьте время на бесконечную очистку кэша. Если ошибка повторяется везде, ищите несовместимое ограничение версии, недоступный коммит или отсутствие права чтения. В сомнительном случае попросите преподавателя обновить зависимость или предоставить зафиксированный рабочий коммит.

FAQ для студентов

Почему Xcode бесконечно остаётся на Resolving Package Graph?

Сначала проверьте, открывается ли адрес репозитория в браузере и читается ли он через Git. Если доступ есть, посмотрите сообщение разрешения зависимостей и ограничения версий в проекте. Не удаляйте Package.resolved автоматически: он может фиксировать рабочий набор версий курса. Если тот же проект не разрешается на чистом Mac, причина, вероятно, связана с репозиторием или его правилами.

Почему зависимость из GitHub не скачивается через Swift Package Manager?

Чаще всего проблема находится до Swift Package Manager: неверно скопирован URL, используется страница проекта вместо адреса Git, сеть блокирует домен или репозиторий требует авторизации. Откройте адрес в браузере, затем выполните безопасную проверку чтения репозитория через Git. Для публичного пакета учётная запись обычно не должна требоваться; запрос пароля является поводом проверить URL и статус доступа.

Можно ли удалить Package.resolved при конфликте версий?

Удаление допустимо только после резервной копии файла и фиксации текущего состояния проекта. Package.resolved хранит выбранные точные версии зависимостей, поэтому его удаление заставляет проект разрешать набор заново. Новое разрешение может изменить не только проблемный пакет, но и связанные зависимости. Для учебного проекта сначала сравните ограничения в Package.swift, файл фиксации и рабочий коммит курса.

Что делать, если сеть учебного заведения не добавляет Swift-пакеты?

Сравните доступ к репозиторию в браузере, чтение через Git и записи журнала Xcode. Такой порядок помогает отличить блокировку домена, прокси, проверку сертификата и ошибку проекта. Не отключайте защиту, не устанавливайте неизвестные сетевые скрипты и не пытайтесь обходить управление устройством. Если изменить настройки нельзя официально, перенесите проверку на разрешённый чистый Mac.

Поможет ли удалённый Mac при ошибке разрешения пакетов Xcode?

Да, если исходный репозиторий доступен, а проблема вызвана школьной сетью, правами установки, повреждённой средой или накопленными настройками. Удалённый Mac не исправит закрытый репозиторий, неправильное ограничение версии или отсутствие доступа участника проекта. Подключитесь к чистой среде, используйте тот же коммит и сравните первоначальное разрешение, повторное открытие проекта и сборку.

Если понадобятся дополнительные объяснения для начинающих, можно начать с введения в работу с Mac для разработки, а затем сверить варианты аренды Mac — именно в контексте временной учебной проверки, а не обязательной замены собственного компьютера.

Когда менять среду, а когда продолжать исправление

Оставайтесь на текущем компьютере, если репозиторий читается, версия пакета согласуется, а ошибка исчезает после точного исправления URL или выбора продукта. Это лучший вариант, когда вы контролируете настройки и можете повторить процедуру самостоятельно.

Попросите преподавателя обновить инструкцию, если в курсе указан удалённый коммит, устаревшее ограничение или файл Package.resolved, который не соответствует опубликованному проекту. В таком случае смена Mac не решит расхождение между материалами курса и репозиторием.

Рассмотрите временную аренду Mac у MACGPU, если репозиторий исправен, но школьный компьютер блокирует доступ, не позволяет устанавливать нужные компоненты или уже содержит конфликтующие настройки. В удалённой среде вы сможете проверить тот же проект без покупки Mac и сначала убедиться, что причина действительно локальная. На странице MACGPU перед началом уточните способ подключения и правила доступа.

Однако это не универсальный ответ: при длительной постоянной нагрузке, необходимости физических устройств или обязательном доступе к локальной сети лучше оценить собственный Mac или официально предоставленный компьютер. Если же цель — закончить учебную лабораторную, проверить SwiftUI-проект и не обходить ограничения школьной системы, чистый удалённый Mac обычно практичнее бесконечной переустановки Xcode.