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

125

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

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

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

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

Зак Толли
источник
Просто заметил, что когда я открываю проект в xcode, создается файл .xcscheme, но в папке xcuserdata / username.xcuserdatad ... но я не понимаю, почему схема «сгенерирована» под папкой пользователей ... и как я собираюсь разобраться с этим в бамбуке
Зак Толли

Ответы:

187

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

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

Краткая версия Fix-it

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

  1. На чистой рабочей копии кода откройте рабочую область вашего проекта.
  2. Выберите «Схема»> «Управление схемами ...» в меню продукта.
  3. Появится список схем, определенных для проекта.
  4. Найдите схему, которую пытается запустить Bamboo
  5. Убедитесь, что для этой схемы установлен флажок «Shared» и что для параметра «Container» установлено значение Workspace, а не сам файл проекта.
  6. Нажмите «ОК», чтобы закрыть лист «Управление схемами».
  7. В вашем проекте по адресу WorkspaceName.xcworkspace / xcshareddata / xcschemes создан новый файл .xcscheme.
  8. Зафиксируйте этот файл в своем репозитории и запустите сборку Bamboo.

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

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

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

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

xcodebuild ищет файл <'scheme' Parameter Value> .xcscheme, существующий в <'workspace' Parameter Value> / xcshareddata / xcschemes.

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

  1. Некоторые автоматизированные задачи, которые волшебным образом выполняет пользовательский интерфейс Xcode, недоступны через интерфейс командной строки Xcodebuild.
  2. Вы можете прикрепить схему и данные конфигурации сборки ко многим местам в `` иерархии контейнеров '' - убедитесь, что ваши данные попадают в правильный контейнер (рабочая область, проект и / или цель сборки)
  3. Подумайте, где в иерархии контейнеров инструмент xcodebuild может искать данные конфигурации; отличный индикатор того, где он начнет поиск, основан на использовании аргументов «-рабочая область» или «-проект».

Поле "Shared" уже отмечено ... что теперь?

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

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

Брайан Мюзиал
источник
Это фактически исправило для меня случайную ошибку xcodebuild, которая возвращала НЕТ ошибок, но код выхода 65. Оказывается, контейнер был настроен на проект, а не на само рабочее пространство, изменил его и вуаля, проблема решена. Спасибо.
Саймон Ли
Спасибо! Это именно то исправление, которое я искал.
raidfive
MY Test и опция архивирования отключены именно из-за этого. Я проверил, что моя схема поделилась. все еще не могу создать через бота. Я могу создавать локально, но, как я уже упоминал, я не могу его заархивировать. Как вы думаете, это связано с этой проблемой?
Аликс
Спасибо! Установка контейнера схемы для моей рабочей области устранила проблемы, которые у меня были с моими сборками TeamCity.
Форма
как найти схему в этом сообщении. Я получаю именно это сообщение. [Xcodebuild: error: рабочая область с именем «jamesAppV2» не содержит схемы с именем «». Опция «-list» может использоваться для поиска названий схем в рабочей области.]
Кадир Хуссейн,
52

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

xcodebuild -list

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

xcodebuild -workspace MyProject.xcworkspace -list

Если вашей схемы нет в списке, исправьте это так:

введите описание изображения здесь

Роберт
источник
Совместное использование схем позволяет им появиться в xcodebuild -list... спасибо!
Дэн Розенстарк
35

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

Но есть ряд вопросов, которые следует учитывать.

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

Ruby & xcodeproj gem

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

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

Так что установите это

sudo gem install xcodeproj

Затем написать простой скрипт на Ruby для повторного использования всех схем, драгоценный камень имеет recreate_user_schemes метод для этой цели

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

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

i4niac
источник
1
Если кто-то еще наткнется на это, похоже, что recreate_user_schemesон неправильно обрабатывает тестовые цели. Я отправил отчет об ошибке .
Мэтт Кантор
Я писал об этом в блоге. nsbogan.com/xcode/2014/05/29/share-xcode-schemes . К сожалению, проблема с модульными тестами до сих пор не устранена.
i4niac
хорошо, я пробовал это решение. Но когда я запустил, xcodebuild -project Finance.xcodeproj -scheme "Finance" -configuration Release clean archive CODE_SIGN_IDENTITY="My Identity"мне было предложено построить и заархивировать «Scheme <IDEScheme: 0x7fc9ea5e5fd0:« Finance »>, но место назначения запуска <IDERunDestination: 0x7fc9eb47c6c0: 'iPad 2'> не является платформой развертывания, и это действие не должно иметь было разрешено ». Но когда я открываю XCode, все работает нормально
Ігар Цімошка
2
archiveдействие всегда подразумевает подписание, а в качестве пункта назначения должно быть указано реальное устройство. В вашем случае пункт назначения iPad 2, который, я думаю, является симулятором, поэтому архивирование невозможно. В вашей команде отсутствует одна важная опция: -sdk iphoneosсначала попробуйте и посмотрите, как это получится. Когда вы запускаете его из Xcode IDE, у вас, вероятно, установлен пункт назначения iOS Deviceили, возможно, у вас подключено реальное устройство, поэтому оно установлено в качестве пункта назначения. Поэтому архивирование работает из IDE. Командная строка более «тупая» и иногда может использовать «неправильные» параметры по умолчанию, поэтому вам нужно быть более конкретным.
i4niac
1
За это следует проголосовать больше - спасибо! Проекты Calabash с фреймворками Swift не могут быть построены с XCode6.1.1, потому что вы должны строить их по схеме. Этот драгоценный камень потрясающий.
Дэвид
9

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

Зак Толли
источник
3

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

Эрик
источник
1

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

изменения

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

Сиддхартха С. Икшаваку
источник
0

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

htzfun
источник
0

Я столкнулся с этой проблемой, и даже если некоторые ответы здесь действительно предоставляют решение, я не нашел его очень ясным. Так что я просто добавлю еще один. Вкратце, как поделиться схемой из excode.

Перейдите к Product> Scheme>Manage Schemes

введите описание изображения здесь

Затем вам будет показан список схем, каждая из которых обозначена как совместно используемая или нет. Просто отметьте те, которыми вы хотите поделиться (они могут быть разными для сборок dev и prod)

введите описание изображения здесь

Изображения взяты из этой статьи https:// developer. Nevercode.io/docs/sharing-ios-project-schemes

Карлос Роблес
источник
0

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

введите описание изображения здесь

, с fastlane lanesправильным отображением всех ваших полос, включая все ваши схемы:

введите описание изображения здесь

, но fastlane gymпоказывать только основные схемы (а не схемы разработки и тестирования):

введите описание изображения здесь

Решение состоит в том, чтобы снять отметку с опции общего доступа для схем , не указанных в списке, fastlane gymа затем проверить ее снова . Он сгенерирует .xcscheme для схем:

введите описание изображения здесь

Теперь, если вы проверите fastlane gym, все схемы будут перечислены:

введите описание изображения здесь

Затем вы должны зафиксировать этот файл .xcshemes в репозитории, чтобы другой разработчик, клонировавший проект, получил файлы.

Сето Элькахфи
источник
0

Для тех, кто с Xcode 11.4 пытается найти кнопку «Shared» на схеме, теперь она перемещена в индивидуальную схему.

  1. Выберите желаемую схему
  2. Нажмите "Редактировать"
  3. Установите флажок "Общий доступ"

Редактирование схемы теперь содержит общий ящик

green0range
источник