在命令行xcodebuild调用之后分发.app文件

时间:2012-02-20 18:19:07

标签: macos command-line xcode4 build build-process

我正在构建/存档我的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文件的路径,以便我可以分发它。

我查看了xcodebuild的MAN页面(并在网上进行了大量搜索),但没有找到任何线索。

3 个答案:

答案 0 :(得分:12)

有一种更简单的方法,只需指定要存档的archivePath:

xcodebuild -archivePath GoTray -scheme GoTray archive

然后,您将在当前目录的GoTray.xcarchive获取xcarchive文件。

接下来,再次运行xcodebuild以从xcarchive文件导出应用程序:

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

答案 1 :(得分:1)

answer provided here的基础上,我想出了一个令人满意的多部分解决方案。这一切的关键是使用Xcode在构建期间创建的环境变量。

首先,我对构建方案的存档阶段进行了后期操作(粘贴到Xcode项目的UI中)。它调用我编写的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,这个脚本可以在其他项目中轻松重用,也可以用于其他目的。

答案 2 :(得分:0)

您可以使用一些shell,获取Archives目录中的最新文件夹(或使用当前日期),然后获取该目录中的最新存档。