我正在构建/存档我的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页面(并在网上进行了大量搜索),但没有找到任何线索。
答案 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目录中的最新文件夹(或使用当前日期),然后获取该目录中的最新存档。