Сбой 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
  1. xcodebuild собирает $NEW_PRODUCT_NAME.app
  2. xcodebuild создает *.a файлы libray CocoaPods с именем $NEW_PRODUCT_NAME.a, которые должны быть libPods-CocoaLumberjack.a и libPods.a
  3. На этапе компоновщика параметры проекта запрашивают соединение с библиотеками с помощью свойств -lPods и -lPods-CocoaLumberjack. Поскольку на библиотечные файлы также влияет свойство PRODUCT_NAME, компоновщик не может найти файлы поиска *.a.
  4. Ошибка сборки

Согласно решению Дина, проблема все еще возникает, даже если записать конфигурацию PRODUCT_NAME в файл *.xcconfig.

А для решения Джоэла конфигурация PRODUCT_NAME перед командой xcodebuild не действует для нового имени продукта.

На вопрос Фул:

И что еще более странно, если я использую первую команду, а затем вторую команду, она будет работать. (Удалите каталог сборки для сброса.)

Это из-за первой сборки, уже созданной необходимыми *.a файлами CocoaPods. Даже во второй раз создается несколько файлов $NEW_PRODUCT_NAME.a (не используется), файлы *.a, необходимые для этапа компоновки, уже существуют для компоновки. Вот почему второй процесс сборки успешен.

Мое решение

Наконец, мое решение состоит в том, чтобы построить проект и библиотеки CocoaPods отдельно.

  1. В папке проекта src
  2. Соберите библиотеки CocoaPods с помощью следующей команды

    xcodebuild -project Pods/Pods.xcodeproj build
    
  3. Создайте проект с помощью следующей команды и добавьте CocoaPods и другие необходимые библиотеки в путь поиска (не забудьте включить все необходимые библиотеки)

    xcodebuild -project $(TARGET_PROJ) \
               -configuration Distribution \
               -target $(TARGET_TAR) \
               PRODUCT_NAME=$(NEW_PRODUCT_NAME) \
               LIBRARY_SEARCH_PATHS="./Pods/build/Release-iphoneos $OTHER_PATH" 
    
  4. Построить!

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

Я нашел ответ. Вам нужно разместить 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.

Удачи!

Другие вопросы по тегам