2012-02-20 66 views
2

我正在構建/存檔我的Mac應用程序,用於從安裝了Xcode 4.3的命令行調用(如下所示)進行分發。清楚的是,我之前沒有針對Xcode 4.3的這個問題的工作解決方案,所以對早期Xcode版本的建議很容易仍然有效。這裏的電話:在命令行之後分發.app文件xcodebuild調用

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

這成功運行,並生成一個.xcarchive文件,位於我~/Library/Developer/Xcode/Archives/<date>文件夾中。獲取歸檔文件生成路徑的正確方法是什麼?我正在尋找一種方法來獲得其中包含的.app文件的路徑,以便我可以分發它。

我看過xcodebuild的MAN頁面(並在網上做了大量的搜索),並沒有在那裏找到任何線索。

回答

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,而且這個腳本很容易在其他項目中重複使用並用於其他目的。

0

您可以使用一些shell,獲取Archives目錄中的最新文件夾(或使用當前日期),然後獲取該目錄中最近的存檔。

12

還有一個更簡單的方法,只需指定要存檔的archivePath:

xcodebuild -archivePath GoTray -scheme GoTray archive 

然後你會得到GoTray.xcarchive的xcarchive文件在當前目錄中。

接下來,再次運行xcodebuild聯編從xcarchive文件導出應用程序:

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

完美!謝謝。 – jrc 2015-02-18 20:12:13

相關問題