Распространение файла .app после вызова командной строки xcodebuild - PullRequest
2 голосов
/ 20 февраля 2012

Я собираю / архивирую свое приложение Mac для распространения из вызова из командной строки (ниже), с установленным Xcode 4.3.Чтобы было ясно, у меня не было работающего решения этой проблемы ранее, до Xcode 4.3, поэтому рекомендации для более ранних выпусков Xcode все еще могли бы быть действительными.Вот вызов:

/usr/bin/xcodebuild -project "ProjectPath/Project.pbxproj" -scheme "Project" -sdk macosx10.7 archive

Это успешно выполняется и генерирует файл .xcarchive, расположенный в моей папке ~/Library/Developer/Xcode/Archives/<date>.Как правильно получить путь к созданному архивному файлу?Я ищу способ получить путь к содержащемуся в нем файлу .app, чтобы я мог его распространить.

Я посмотрел на страницу MAN для xcodebuild (и выполнил обильный поиск в Интернете) и не нашел там никаких подсказок.

Ответы [ 3 ]

12 голосов
/ 16 ноября 2013

Есть более простой способ, просто укажите archivePath, который вы хотите заархивировать:

xcodebuild -archivePath GoTray -scheme GoTray archive

Затем вы получите файл xcarchive по адресу GoTray.xcarchive в текущем каталоге.

Затем снова запустите xcodebuild, чтобы экспортировать приложение из файла xcarchive:

xcodebuild -exportArchive -exportFormat APP -archivePath GoTray.xcarchive -exportPath GoTray
1 голос
/ 23 февраля 2012

Опираясь на ответ , предоставленный здесь , я нашел удовлетворительное решение, состоящее из нескольких частей. Ключом ко всему этому было использование переменных среды, которые Xcode создает во время сборки.

Во-первых, у меня есть пост-действие на этапе Archive моей схемы сборки (вставленной в пользовательский интерфейс проекта Xcode). Он вызывает скрипт Python, который я написал (предоставленный в следующем разделе), передавая ему имена переменных среды, которые я хочу извлечь, и путь к текстовому файлу:

# Export the archive paths to be used after Archive finishes
"${PROJECT_DIR}/Script/grab_env_vars.py" "${PROJECT_DIR}/build/archive-env.txt"
"ARCHIVE_PATH" "ARCHIVE_PRODUCTS_PATH" "ARCHIVE_DSYMS_PATH"
"INSTALL_PATH" "WRAPPER_NAME"

Затем этот сценарий записывает их в текстовый файл парами key = value:

import sys
import os

def main(args):
    if len(args) < 2:
        print('No file path passed in to grab_env_vars')
        return

    if len(args) < 3:
        print('No environment variable names passed in to grab_env_vars')

    output_file = args[1]

    output_path = os.path.dirname(output_file)
    if not os.path.exists(output_path):
        os.makedirs(output_path)

    with open(output_file, 'w') as f:
        for i in range(2, len(args)):
            arg_name = args[i]
            arg_value = os.environ[arg_name]
            #print('env {}: {}'.format(arg_name, arg_value))
            f.write('{} = {}\n'.format(arg_name, arg_value))

def get_archive_vars(path):
    return dict((line.strip().split(' = ') for line in file(path)))

if __name__ == '__main__':
    main(sys.argv)

Затем, наконец, в моем скрипте сборки (также Python) я анализирую эти значения и могу найти путь к архиву и пакет приложений в нем:

env_vars = grab_env_vars.get_archive_vars(ENV_FILE)
archive_path = env_vars['ARCHIVE_PRODUCTS_PATH']
install_path = env_vars['INSTALL_PATH'][1:] #Chop off the leading '/' for the join below
wrapper_name = env_vars['WRAPPER_NAME']
archived_app = os.path.join(archive_path, install_path, wrapper_name)

Это был способ, которым я решил это, и он должен быть довольно легко адаптируем для других сред сценариев. Это имеет смысл с моими ограничениями: я хотел, чтобы в проекте было как можно меньше кода, я предпочитаю сценарии Python вместо Bash, и этот сценарий можно легко использовать в других проектах и ​​для других целей.

0 голосов
/ 20 февраля 2012

Вы можете просто использовать немного оболочки, получить самую последнюю папку в каталоге Archives (или использовать текущую дату), а затем получить самый последний архив в этом каталоге.

...