2012-02-20 3 views
2

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

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

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

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

ответ

1

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

Во-первых, у меня есть пост-действие на фазе архива моей схемы построения (вставлено в пользовательский интерфейс проекта 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

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

12

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

xcodebuild -archivePath GoTray -scheme GoTray archive 

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

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

xcodebuild -exportArchive -exportFormat APP -archivePath GoTray.xcarchive -exportPath GoTray 
+0

Отлично! Благодарю. – jrc

Смежные вопросы