Xcodebuild говорит, что не содержит схемы

У меня проблема с любопытством.

У меня есть проект, над которым я работал и всегда был построен из XCode IDE, и он работал нормально. Теперь я настраиваю Bamboo для создания проекта и, как таковой, строю его из командной строки.

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

Какая магия XCode делает, когда я открываю проект, или я делаю что-то немое, возможно, исключая файл в моем .gitignore, который я не должен делать?

Ответ 1

Вы определенно находитесь на правильном пути в отношении файла .xcscheme - у меня возникла эта проблема при настройке моих собственных проектов!

Для потомков или, по крайней мере, для тех, кто попадает сюда из поиска, вот две версии вещей - версия "Я занят, так что просто скажу", и более активное обсуждение и обоснование. Обе версии предполагают, что вы пытаетесь построить из файла Workspace; если вы не являетесь моими извинениями, поскольку это в основном применимо к проектам на основе рабочей области.

Сжатая версия Fix-it

Основной причиной является то, что поведение схем по умолчанию заключается в сохранении схем 'private', пока они не будут помечены как общие. В случае инициированной командной строкой пользовательский интерфейс Xcode никогда не запускается, а инструмент xcoderun не имеет собственного кэша схем для работы. Цель состоит в создании, совместном использовании и фиксации схемы, которую вы хотите запустить Bamboo:

  • На чистой рабочей копии кода откройте рабочую область проекта.
  • Выберите "Схема" > "Управление схемами..." в меню "Продукт".
  • Появится список схем, определенных для проекта.
  • Найдите схему Bamboo пытается запустить
  • Убедитесь, что флажок "Общий" установлен для этой схемы и что для параметра "Контейнер" установлено значение "Рабочая область", а не файл проекта.
  • Нажмите "ОК", чтобы закрыть лист "Управление схемами".
  • В вашем проекте создан новый файл .xcscheme в WorkspaceName.xcworkspace/xcshareddata/xcschemes.
  • Перенесите этот файл в свой репозиторий и запустите сборку Bamboo.

Более глубокое обсуждение и обоснование

Xcode 4 представил рабочие области и схемы как способ помочь и приручить часть хаоса, которая присуща работе с механиками проводки связанных проектов Xcode, сборки целей и создания конфигураций вместе. Сама рабочая область имеет свой собственный набор конфигурационных данных, который описывает каждый из меньших "ящиков" данных, которые он содержит, и действует как скелет для прикрепления файлов .xcodeproj и набора данных общей конфигурации, которые зеркалируются для каждой машины разработчика или системы CI, Это и сила, и ловушка рабочих областей - есть 1) множество способов, с помощью которых можно получить настройки на 100% правильно, но положить в неправильный контейнер или 2) положить в правильный контейнер, но настроен неправильно что делает данные недоступными для других частей системы!

Поведение по умолчанию для схем Xcode 4 заключается в том, чтобы автоматически генерировать новые схемы, поскольку проекты добавляются в файл рабочей области. Те из вас, кто добавил несколько файлов .xcodeproj, возможно, заметили, что ваш список схем быстро становится неуправляемым, особенно когда файлы проекта добавляются, затем удаляются, а затем считываются в одно и то же рабочее пространство. Все схемы, созданные автоматически или вручную, по умолчанию являются 'private' схемами, видимыми только для текущего пользователя, даже если файлы .xcuserdata зафиксированы с данными проекта и конфигурацией. Это основная причина этой ошибки криптовальной сборки. Отчеты Bamboo от xcodebuild. Поскольку Bamboo управляет сборкой через командную строку, а не с Xcode UI, у нее нет возможности для получения автоматических сгенерированных схем и зависит только от тех, которые определены в самой рабочей области. Предполагая, что вы сконфигурировали Bamboo для создания из рабочей области с помощью следующей команды:

xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyApplication -configuration Debug

xcodebuild ищет файл < 'схема' Параметр Значение > .xcscheme, существующий в < 'workspace' Параметр Значение > /xcshareddata/xcschemes.

Очевидно, существуют пучки способов настройки Bamboo и рабочего пространства, поэтому имейте в виду, что ваша уникальная конфигурация не может сопоставлять 100% с тем, что представлено здесь. Основные выходы:

  • Определенные автоматизированные задачи, которые пользовательский интерфейс Xcode волнует, недоступны через CLI Xcodebuild.
  • Вы можете присоединить схему и построить данные конфигурации во многих местах в "контейнерной иерархии". Убедитесь, что ваши данные завершаются в правильном контейнере (Workspace, Project и/или Build Target).
  • Рассмотрим, где в иерархии контейнеров инструмент xcodebuild может искать данные конфигурации; отличный показатель того, где он начнет искать, основан на использовании аргументов "-workspace" или "-project".

Ящик 'Shared' уже проверен... теперь что?

Я столкнулся с этой же проблемой в моем собственном экземпляре Bamboo; выяснилось, что схема, которая была зафиксирована в моем репозитории, устарела, и последняя версия инструментов командной строки не обрабатывала ее изящно. Так как это существовало ранее, я просмотрел настройки, чтобы убедиться, что в схеме нет ничего необычного в отношении схемы, удалены и воссозданы схема, гарантирующая, что я пометил ее как "Shared", и вернул новый файл .xcscheme в хранилище.

Если все выглядит хорошо и перестраивает, это не решает проблему, дважды проверьте эту настройку контейнера - действительно легко получить эту схему, прикрепленную к неправильному контейнеру в иерархии!

Ответ 2

Отладить проблему следующим образом:

xcodebuild -list

или если вы используете рабочую область (например, с контейнерами)

xcodebuild -workspace MyProject.xcworkspace -list

Если схема не указана, выполните следующие действия:

enter image description here

Ответ 3

Большинство ответов предложили бы сделать вашу схему совместной с использованием Xcode, а затем зафиксировать изменения в репо. Это работает, конечно, но только в том случае, если у вас есть доступ к исходному коду и у вас есть права на внесение изменений и на пару других допущений.

Но существует ряд ", что ifs" для рассмотрения

  • Что делать, если вы по какой-то причине не можете изменить проект Xcode?
  • Что делать, если вы автоматически создаете новую схему на CI-сервере?
    Это на самом деле происходит довольно часто. Если вы используете платформу автоматизации тестирования, например Calabash, вы обычно будете дублировать существующую цель, которая автоматически дублирует схему, а новая схема не будет использоваться совместно, даже если исходная схема была.

Драгоценный камень Ruby и xcodeproj

Я бы рекомендовал использовать xcodeproj Ruby gem. Это действительно классный инструмент с открытым исходным кодом, который поможет вам автоматизировать множество задач, связанных с Xcode.

Btw, это жемчужина, используемая CocoaPods, чтобы объединиться с проектами и рабочими пространствами Xcode.

Итак, установите его

sudo gem install xcodeproj

Затем напишите простой Ruby script, чтобы перераспределить все схемы, для этой цели у этого метода recreate_user_schemes

#!/usr/bin/env ruby
require 'xcodeproj'
xcproj = Xcodeproj::Project.open("MyProject.xcodeproj")
xcproj.recreate_user_schemes
xcproj.save

Он не просто копирует файлы схемы из пользовательской папки в xcshareddata/xcschemes, но также создает эти файлы, анализируя файл pbxproj.

Ответ 4

Хорошо, я знаю его через 2 минуты, но я обнаружил еще одно переполнение стека, в котором говорится, что схема должна быть установлена ​​в общий доступ... Где Xcode 4 хранит данные схемы?

Ответ 5

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

Ответ 6

У вас такая же проблема, но при построении с xcode как подпроектом основного. Встроенный подпроект в автономном режиме xcode - после этого эта ошибка исчезла.

Ответ 7

У меня была эта ошибка при реализации CI. Вопрос выше идентичен моим проблемам, за исключением того, что я использую собственный инструмент CI для Gitlab. Вы можете проверить, есть ли такой файл в Bamboo.
Я решил это, внеся некоторые изменения в файл gitlab-ci.yml.
После того, как вы сделали свой scheme availabe, поделившись. В Xcode Перейдите к Products>Scheme>Manage Scheme и проверьте общий доступ.

Изменения

Установить абсолютный путь везде.
например, xcodebuild clean archive -archivePath /path/to/your/project/build/testDemo -scheme testDemo | xcpretty
здесь вам нужно изменить /path/to/your/project/ своим путем и testDemo на ваше имя проекта.