Сбой xcodebuild проекта cocoapods с PRODUCT_NAME
Я могу построить свой проект Cocoapods с помощью этой команды:
base=$(basename *.xcworkspace .xcworkspace) xcodebuild -sdk "iphonesimulator$ios_version" \
CONFIGURATION_BUILD_DIR="$build_dir/build" \
-workspace $base.xcworkspace -scheme $base -configuration AdHoc \
DSTROOT=$build_dir \
OBJROOT=$build_dir \
SYMROOT=$build_dir \
ONLY_ACTIVE_ARCH=NO \
"$@"
Однако, если я использую эту команду, она завершится неудачно
base=$(basename *.xcworkspace .xcworkspace) xcodebuild -sdk "iphonesimulator$ios_version" \
CONFIGURATION_BUILD_DIR="$build_dir/build" \
-workspace $base.xcworkspace -scheme $base -configuration AdHoc \
PRODUCT_NAME=app \ <============= THIS IS THE EXTRA LINE =====
DSTROOT=$build_dir \
OBJROOT=$build_dir \
SYMROOT=$build_dir \
ONLY_ACTIVE_ARCH=NO \
"$@"
И что еще более странно, если я использую первую команду, а затем вторую команду, она будет работать. (Удалите каталог сборки для сброса.)
Другие испытывают ту же проблему? И возможно ли построить проект cocoapods, используя PRODUCT_NAME и CONFIGURATION_BUILD_DIR вместе другим способом?
3 ответа
Попробуйте создать файл конфигурации и переместите переменные PRODUCT_NAME и CONFIGURATION_BUILD_DIR в флаг xcconfig в вашей команде xcodebuild.
Пример вашего текстового файла xcconfig будет выглядеть так:
PRODUCT_NAME='This is my app'
CONFIGURATION_BUILD_DIR=/Users/myusername/Documents/myiosproject/build
Передайте его в свой xcodebuild:
xcodebuild [options and other args] -xcconfig mynewconfig.xcconfig
Возможно, вы захотите сделать чистку и удалить DerivedData для хорошей меры, и, возможно, попробуйте команду сборки пару раз. Командная строка xcodebuild выглядит довольно привередливой.
Изменить: Если вы можете, я рекомендую дать Xctools выстрел. Это заставило мою головную боль с xcodebuild уйти.
У меня та же проблема, и я нашел причину проблемы.
Среда: Xcode 6.1 (6A1052c), OSX 10.10 (14A389)
проблема
Причина в том, что свойство PRODUCT_NAME влияет не только на встроенные *.app, но и на файлы *.a файлов для CocoaPods.
Я попробовал решения Дина и Джоэла, но у меня не получилось. В моем сценарии мне нужно создать много файлов *.app с другим названием продукта и немного отличающимися по ресурсам и настройкам изображения. Таким образом, я хочу создать различные *.app-файлы в скрипте сборки, который можно запустить одним щелчком мыши.
Вот что произойдет, если мы установим PRODUCT_NAME в параметрах xcodebuild с помощью *.xcworkspace в следующей команде:
xcodebuild -workspace $PROJECT_NAME.xcworkspace \
-scheme $PROJECT_NAME \
-configuration Distribution \
CONFIGURATION_BUILD_DIR=$PROJECT_SRC/build \
PRODUCT_NAME=$NEW_PRODUCT_NAME build
- xcodebuild собирает $NEW_PRODUCT_NAME.app
- xcodebuild создает *.a файлы libray CocoaPods с именем $NEW_PRODUCT_NAME.a, которые должны быть libPods-CocoaLumberjack.a и libPods.a
- На этапе компоновщика параметры проекта запрашивают соединение с библиотеками с помощью свойств -lPods и -lPods-CocoaLumberjack. Поскольку на библиотечные файлы также влияет свойство PRODUCT_NAME, компоновщик не может найти файлы поиска *.a.
- Ошибка сборки
Согласно решению Дина, проблема все еще возникает, даже если записать конфигурацию PRODUCT_NAME в файл *.xcconfig.
А для решения Джоэла конфигурация PRODUCT_NAME перед командой xcodebuild не действует для нового имени продукта.
На вопрос Фул:
И что еще более странно, если я использую первую команду, а затем вторую команду, она будет работать. (Удалите каталог сборки для сброса.)
Это из-за первой сборки, уже созданной необходимыми *.a файлами CocoaPods. Даже во второй раз создается несколько файлов $NEW_PRODUCT_NAME.a (не используется), файлы *.a, необходимые для этапа компоновки, уже существуют для компоновки. Вот почему второй процесс сборки успешен.
Мое решение
Наконец, мое решение состоит в том, чтобы построить проект и библиотеки CocoaPods отдельно.
- В папке проекта src
Соберите библиотеки CocoaPods с помощью следующей команды
xcodebuild -project Pods/Pods.xcodeproj build
Создайте проект с помощью следующей команды и добавьте CocoaPods и другие необходимые библиотеки в путь поиска (не забудьте включить все необходимые библиотеки)
xcodebuild -project $(TARGET_PROJ) \ -configuration Distribution \ -target $(TARGET_TAR) \ PRODUCT_NAME=$(NEW_PRODUCT_NAME) \ LIBRARY_SEARCH_PATHS="./Pods/build/Release-iphoneos $OTHER_PATH"
Построить!
Это сделано для того, чтобы у меня был скрипт сборки одним щелчком для того же двоичного файла, но с некоторыми другими изображениями и настройками. Надеюсь, что это поможет кому-то, кто имеет ту же проблему.
Я нашел ответ. Вам нужно разместить PRODUCT_NAME=MyProductName
до xcodebuild
Команда дана.
Так
# This does NOT work
xcodebuild ... options ... PRODUCT_NAME=MyProductName
# This DOES work
PRODUCT_NAME=MyProductName xcodebuild ... options ...
Не уверен, почему этот второй из работает, а первый нет. Я предполагаю, что вторая форма позволяет настройке просачиваться более глубоко вниз к компоновщику и другим подкомандам, которым делегирует xcodebuild, как лучший параметр env var, тогда как первая - нет. Но это только предположение. В любом случае, вторая форма работает.
Я проверил это в OS X 10.9.2 с Xcode 5.1.1.
Удачи!