2015-12-06 3 views
5

Следующая команда виснет на моей OSX:xcodebuild командной строки вешает

xcodebuild -scheme myscheme clean archive -archivePath /tmp 

Эта команда дает два выходных линий, а затем вешает:

User defaults from command line: 
    IDEArchivePathOverride = /tmp 

Теперь этот проект не имеет рабочее пространство генерироваться как он был создан из командной строки кордовы (cordova build ios). Единственный способ - открыть xcode и закрыть его. это создает рабочую область, а затем эта команда успешно завершена.

Неужели кто-нибудь испытывал нечто подобное и знал, что из этого вышло? Любой способ создать это рабочее пространство из командной строки?

+0

ли это с помощью процессора? – trojanfoe

+0

nope. просто зависает. – Tal

ответ

14

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

open "My Project.xcodeproj" 
sleep 10 
killall Xcode 
xcodebuild -scheme "My Project" clean archive "build/MyProject" 

Не красиво, но работает для меня.

+7

это, безусловно, самое уродливое обходное решение, которое я когда-либо кодировал :) – Tal

+0

Я больше не мог согласиться! – Anytoe

+0

Поистине ужасно, но единственное, что работает до сих пор. :(Примечание: также для сборки Кордовы вы должны добавить ENABLE_BITCODE = NO в конфигурацию –

9

Попробуйте настроить схему как общую.

Это можно сделать, перейдя в «Управление схемами ...» и установив флажок «Общий».

Apple, документы этого процесса здесь: https://developer.apple.com/library/ios/recipes/xcode_help-scheme_editor/Articles/SchemeShare.html

+0

Я только что попробовал, и это работает, проблема в том, что когда вы работаете в кордовой/ионной среде, xcodeproj можно удалить и восстановлено (восстановление ионного состояния), и предыдущая конфигурация потеряна. –

+0

Также подтвердил, что это работает. Ответ от @anytoe не сработал для меня. –

+0

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

2

Если вы уже имеете, или готовы сделать, Ruby доступны для вашей системы сборки, то вы могли бы use this solution.

Установите xcodeproj камень на вашей системе сборки

sudo gem install xcodeproj 

, а затем интегрировать следующий рубиновый скрипт в ваш проект (переименовав свой путь xcodeproj).

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

В статье объясняется, как сделать его частью Cordova крючка, если вы делаете это, я просто назвал рубин прямо из моего Дженкинс строить.

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

0

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

  1. Cordova добавить платформу Ios
  2. Cordova построить ...
  3. открытые платформы/ИОС/Whatever.xcodeproj в Xcode
  4. создать xcuserdata_template
  5. сП -R платформы/ИОС/все.xcodeproj/xcuserdata xcuserdata_template/
  6. заменить уникальный идентификатор в этом шаблоне с XXXXXXXXXX
  7. обновления вашего крюка, который работает xcodebuild

Шаг 7 пример:

XCODE_PROJ=path/to/Whatever.xcodeproj 

# get the mysterious id 
ID=`grep "Whatever \*\/ = {" $XCODE_PROJ/project.pbxproj | \ 
    grep -io "[-A-Z0-9]\{24\}"` 

mkdir -p $XCODE_PROJ/xcuserdata 

XCUSERDATAD=$XCODE_PROJ/xcuserdata/`whoami`.xcuserdatad 

if [ ! -d "$XCUSERDATAD" ]; then 
    cp -R path/to/xcuserdata_template/username.xcuserdatad \ 
     $XCUSERDATAD 
    find $XCUSERDATAD -type f -exec sed -i '' -e "s/XXXXXXXXXX/$ID/g" {} \; 
fi 

xcodebuild ... 
Смежные вопросы