Xcode 4 & three20 & create IPA archive: Нет такого файла или каталога

В Xcode 3.2.5 я использую "Build And Archive" для создания файла IPA без каких-либо проблем. Как я могу это сделать в Xcode 4? Я думаю, что мне нужно использовать "Продукт → Архив", но я получаю более 100 сообщений об ошибках в трехмерной структуре. Большинство из них: "Нет такого файла или каталога". ( "Продукт → сборка для → сборка для архивирования" ). Нет ошибок.)

Например, это первое сообщение об ошибке:

../scripts/Protect.command: line 23: cd: /Users/[USERNAME]/Library/Developer/Xcode/DerivedData/[PROJECTNAME]-blabla/ArchiveIntermediates/[PROJECTNAME]/BuildProductsPath/Release-iphoneos/../three20/Three20Core: No such file or directory

Путь "/[PROJECTNAME]/BuildProductsPath/three20/" действительно не существует, но этот путь существует: "/[PROJECTNAME]/three20/"

Что я могу сделать?

Ответ 1

Документация Three20 не решила эту проблему для меня (к сожалению...). В конечном счете то, что сработало для меня, было комбинацией нескольких решений. Существует разница между "Архив" и "Создать для архивации" (или сборка для запуска), и с помощью этих шагов у меня есть оба из них, которые не работают без проблем сборки:

Вам нужно будет изменить сценарии как Манни, упомянутые, установите флаг "Пропустить установку" для каждого проекта Three20, связанного с вашим деревом проектов, и добавьте следующие пути к ваш проект "Пути поиска заголовков":

"$ (BUILT_PRODUCTS_DIR)/../Three20" "$ (BUILT_PRODUCTS_DIR)/../../Three20"

это поможет вам работать с опцией Build. Если вы хотите выполнить действие архива, вам также нужно будет изменить предпочтение "Местоположения" в Xcode как выше, чем указано выше.

Я задокументировал эти шаги в этом post.

Ответ 2

Конфигурация, которая работает как для сборки, так и для архива в Xcode4.
https://github.com/pazustep/three20/commit/4a9aad4eb90a6962dd729d245f9293a7cc0d7f36


SRC/общая/Конфигурация/Paths.xcconfig

REPO_ROOT_PATH    = $(SRCROOT)/../..
ROOT_SOURCE_PATH  = $(REPO_ROOT_PATH)/src

//OBJROOT = $(REPO_ROOT_PATH)/Build
//SYMROOT = $(OBJROOT)/Products

// Search Paths

LIBRARY_SEARCH_PATHS    = $(STDLIB_LIBRARY)
//HEADER_SEARCH_PATHS     = $(STDLIB_HEADERS) "$(CONFIGURATION_BUILD_DIR)/../three20"
HEADER_SEARCH_PATHS     = $(STDLIB_HEADERS) "$(BUILT_PRODUCTS_DIR)/../three20" "$(BUILT_PRODUCTS_DIR)/../../three20"

SRC/скрипты/Protect.command

# Ignore whitespace characters in paths
IFS=$'\n'

#cd ${CONFIGURATION_BUILD_DIR}${PUBLIC_HEADERS_FOLDER_PATH}

if [ "${DEPLOYMENT_LOCATION}" == "YES" ]; then
    PREFIX=${BUILT_PRODUCTS_DIR}/..
else
    PREFIX=${BUILT_PRODUCTS_DIR}
fi

cd ${PREFIX}${PUBLIC_HEADERS_FOLDER_PATH}

chmod a-w *.h 2>> /dev/null
chmod a-w private/*.h 2>> /dev/null

exit 0

Ответ 3

Еще одна вещь, которая может отбросить процесс сборки, - это имя схемы, содержащее пробелы.

XCode не остановит вас от этого, но если вы используете для своей схемы такое имя, как "Ad Hoc", вы получите те же ошибки:

Three20/Three20+Additions.h: No such file or directory

Ответ 4

Я изучаю это прямо сейчас и, надеюсь, соберет подходящий патч, который работает как в Xcode 3.2. #, так и в Xcode 4.

Изменить: Таким образом, самый простой способ получить старые проекты Xcode 3.2 для работы с Xcode 4 - это сделать следующее:

  • Перейдите в настройки Xcode 4 (Cmd +,).
  • Выберите вкладку "Местоположения".
  • Где он говорит "Построить местоположения", выберите раскрывающийся список и выберите "Разместить сборку продуктов в местах, указанных целями"

Я напишу статью о tr20.info, в которой подробно расскажу об этом.

Ответ 5

three20.info: Руководство по переходу Xcode 4
http://three20.info/article/2011-03-10-Xcode4-Support

Это руководство было составлено команда Three20, чтобы помочь вам перенести свои приложения на Xcode 4 успешно.

Ответ 6

Убедитесь, что имя вашей схемы не содержит пробелов. Это также приводит к ошибке сборки "Файл не найден".

Ответ 7

Мне нужно было перейти в Project Info > Build (вкладка) и добавить в путь поиска заголовка следующее:

three20/Build/Products/three20

Этот путь может быть специфичным для моего проекта, но там он на тот случай, если он работает для кого-то другого.

Ответ 8

Откройте файл /src/common/Configurations/Paths.xcconfig

старый код:

HEADER_SEARCH_PATHS     = $(STDLIB_HEADERS) "$(CONFIGURATION_BUILD_DIR)/../three20"

новый код:

HEADER_SEARCH_PATHS     = $(STDLIB_HEADERS) "$(CONFIGURATION_BUILD_DIR)/../../three20"

Итак, у меня все еще есть 7 ошибок, но я могу создать архив...

Ответ 10

Ответ Амира Наора идеален. Я проверил его ответ на xcode 4.2, и он сработал. Я пропустил шаг "Вам нужно будет изменить сценарии, как упоминалось выше в Manni", поэтому я продолжал получать аналогичную ошибку, указанную в исходном вопросе. надеюсь, что вы не совершите ту же ошибку. также как и в xcode 4.2, шаг "тогда вам также нужно будет изменить предпочтения" Местоположения "в Xcode как выше, чем указано выше". больше не требуется.

Ответ 11

Я сделал следующее, чтобы заставить его работать для меня:

  • для статической библиотеки три20, я использовал cocoapods, чтобы включить файлы в основной проект.. он просто избавился от всех Тревога три20 давала мне (и они много..) btw я попытался заменить tr20 Nimbus.., но Nimbus не хватало некоторых из функции, которые мой проект использовал три20 для.. так что Нимбус не помог.
  • установить пропустить установку до да в соответствии с настройками сборки для всех других подпроектов/статических библиотек и переключить заголовки копий из публики в проект в фазах сборки
  • : в подбиблиотеках. В фазах сборки я гарантировал, что назначение копировать файлы было изменено с Absolute path на products directory.

и все!

подсказка:, чтобы получить представление о файлах с нарушением, которые заставляют ваш архив создавать файл архива, а не ipa:

  • Выберите архив и нажмите кнопку "Распространять".
  • Выберите параметр "Сохранить встроенные продукты".
  • Нажмите "Далее" и "Сохранить".
  • Просмотрите созданный каталог в Finder.
  • В подкаталоге "library" будут указаны библиотеки, которые необходимо установить для параметра "Пропустить установку" на "Да".
  • в некоторых случаях usr/local/include будет идентифицировать файлы заголовков преступника, которые вам нужно переместить из Public в Project, или файлы, которые вы должны изменить, от абсолютного пути к каталогу продуктов. но этот каталог (например, usr/local/include) изменяется в зависимости от структуры вашей подкаталога

Ответ 12

Если вы хотите быстро обходной путь, просто выполните следующие простые шаги:

1. перейдите к указанному пути /Users/[USERNAME]/Library/Developer/Xcode/DerivedData/[PROJECTNAME]-blabla/ArchiveIntermediates/[PROJECTNAME]/BuildProductsPath/ (он будет в вашем сообщении об ошибке). Это должно быть подстрока до /.. в этом пути.
2. создайте папку Release-iphoneos (или Debug-iphoneos если есть)

Тогда все будет хорошо построено!

Three20 script предполагает, что у вас уже есть эта папка, но когда вы строите первый раз, никто не существует. Вот почему вам нужно исправлять "Build" и "Archive" отдельно: действие "Build" обычно использует папку Debug-iphoneos, а действие "Archive" использует Release-iphoneos.

Совет: вы можете сразу создать все необходимые папки, чтобы избежать проблем с различными конфигурациями. Это:
Release-iphoneos
Debug-iphoneos
Release-iphonesimulator
Debug-iphonesimulator