Xcodebuild - создание рабочей области и настройка пользовательского пути сборки
Я пытаюсь использовать xcodebuild
для создания многопроектного проекта в рабочей области. Когда XCode создает рабочую область, он автоматически помещает все артефакты сборки в общий каталог в DerivedData, чтобы каждый проект мог получить к нему доступ.
Если я использую эту команду:
xcodebuild -workspace myWorkspace.xcworkspace -schema builtIt -configuration Release
Все работает, но артефакты помещаются в обычный каталог данных. Затем я должен появиться в конкретном каталоге, доступ к которому я могу получить из сборников CI. Поэтому я попробовал это
xcodebuild -workspace myWorkspace.xcworkspace -schema builtIt -configuration Release SYMROOT=build/products OBJROOT=build/intermediates
Однако xcodebuild терпит неудачу с этим высказыванием
Details: Failed to load dependencies output contents from ``/Users/d4rkf1br3/projects/dNodi/build/intermediates/dNodi.build/Debug-iphoneos/dNodi.build/StaticAnalyzer/normal/armv7/DNRootSelector.d''.
Error: Error Domain=NSCocoaErrorDomain Code=260 "The file "DNRootSelector.d" couldn’t be opened because there is no such file."
UserInfo=0x4012fea40 {NSFilePath=/Users/d4rkf1br3/projects/dNodi/build/intermediates/dNodi.build/Debug-iphoneos/dNodi.build/StaticAnalyzer/normal/armv7/DNRootSelector.d, NSUnderlyingError=0x4012fc240 "The operation couldn’t be completed. No such file or directory"}.
User info: {
NSFilePath = "/Users/d4rkf1br3/projects/dNodi/build/intermediates/dNodi.build/Debug-iphoneos/dNodi.build/StaticAnalyzer/normal/armv7/DNRootSelector.d";
NSUnderlyingError = "Error Domain=NSPOSIXErrorDomain Code=2 \"The operation couldn\U2019t be completed. No such file or directory\"";
}
Проблема заключается в том, что xcodebuild больше не использует центральный каталог для всех проектов в рабочей области и вместо этого хранит артефакты в каждом проекте. Следовательно, он не может найти зависимости между скомпилированным кодом и артефактами, создаваемыми в других проектах.
Кто-нибудь знает правильный параметр для установки в командной строке?
Ссылка на установку кода Xcode не обновляется в течение двух лет, поэтому я не знаю, есть ли новые настройки сборки, которые я могу применить.
Ответы
Ответ 1
Я не уверен, что это новый вариант, но в версии 5.0 xcodebuild
есть опция -derivedDataPath
, которая позволяет вам указать каталог, в который вы хотите, чтобы все продукты сборки сидели.
Например, передача -derivedDataPath build
создает папку build
относительно того, с которой вы запускали xcodebuild
, и вы можете найти свое приложение в подпапке, например build/Build/Products/Release-iphoneos
.
Документация: https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html
Ответ 2
Лучшим решением, которое я нашел до сих пор, является использование параметра CONFIGURATION_BUILD_DIR
с помощью пути ABSOLUTE (например,/tmp/$PROJECT/build). Вот так:
xcodebuild -scheme "scheme" -configuration Debug -sdk iphoneos clean build CONFIGURATION_BUILD_DIR=$ABSOLUTE_BUILD_PATH
Я использую Jenkins, и там у меня есть переменная с именем $WORKSPACE
. С $WORKSPACE/build
в качестве моего CONFIGURATION_BUILD_DIR
у меня есть решение, которым я доволен.
Относительные пути не работают должным образом. Мы должны представить отчет об ошибке.
Ответ 3
Я также встретил эту проблему, когда создаю свой проект из инструмента Jenkins CI. Мой основной проект зависит от подпроекта. Я попытался построить следующее решение @Chilloutman следующим образом:
xcodebuild -target TravelGuideMdd -sdk iphoneos -configuration DailyBuild clean build CONFIGURATION_BUILD_DIR=/Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build BUILD_DIR =/Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build
или
xcodebuild -target TravelGuideMdd -sdk iphoneos -configuration DailyBuild clean build CONFIGURATION_BUILD_DIR=/Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build
Оба из них имеют ошибки Could not find iphoneos in /Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build
Но я получаю успех, наконец, используя это:
xcodebuild -target TravelGuideMdd -sdk iphoneos6.1 -configuration DailyBuild clean build SYMROOT=/Users/mobileserver/jenkins_home/jobs/TravelGuide-Buid-For-Me/workspace/build
То есть: установка SYMROOT с абсолютными путями.
Ответ 4
У меня была аналогичная проблема, и она работала локально, но не на машине сборки. Оказалось, что я забыл инициализировать подмодуль git на машине сборки. Надеюсь, это поможет кому-то.