Daily Build對軟體的品質也有很大的協助。每天一個可啟動並執行版本出來,測試就可以開始測了。儘早的測出bug來,儘早的修改。這些都會在不大量增加工作量的前提下保證代碼品質。比在最後的最後通宵熬夜效果好到不知道多少。XCODEBUILD
下面Daily Build iOS項目。Xcode有一個command tool的工具xcodebuild。用這個工具可以用來使用命令列編譯Xcode項目。
然後先看看這個xcodebuild都能做些什麼。輸入man xcodebuild命令:
功能很強大!不過我們目前要用到的還只是其中的一小部分。一點點的看。
切換到你項目所在的目錄
cd /Users/username/Desktop/MyiOSApp/
試試這句
xcodebuild -configuration Distribution clean build
最後看到這句** BUILD SUCCEEDED **就算是命令執行成功了。你可以在你的目錄下發現一個建立的檔案夾build,在這個檔案夾裡就可以找到編譯並且打包好的你的app:YourProjectName.app。沒錯這個打好得包是app格式的。我們要得時ipa的包,腫麼辦呢。往下看。
xcodebuild -scheme MyiOSApp archive -archivePath /Users/username/Desktop/MyiOSApp.xcarchive
xcodebuild命令,這裡使用-scheme來打包成xcarchive。然後。
xcodebuild -exportArchive -exportFormat ipa -archivePath /Users/username/Desktop/MyiOSApp.xcarchive -exportPath /Users/username/Desktop/MyiOSApp.ipa
這個命令執行完成之後,你就會在剛剛產生的build檔案夾裡找到你的app的ipa包了。
自動化起來
用shell把xcodebuild命令串起來?No,用Python。使用Python可以做shell能做的,還可以做shell不能的。而且python簡單易學,誰拿過來都可以分分鐘學會。最關鍵的一點,很多的linux系統都已經預裝了python。mac也不例外。現在mac預設安裝的時Python2.7的環境。所以,下面的代碼都是基於Python2.7的。
上面講了“大象裝冰箱”的三步走。一一的用Python代碼實現出來。
準備工作
下面用接收命令列的方式傳入三步走中需要指定的內容。Python在執行的時候是這樣的:
python yourFileName.py command line
我們要傳入的參數包括scheme的名稱,項目所在的目錄等。還有別的,目前所用到的主要是這兩個。例如:
python yourFileName.py --scheme=[your scheme name] -x [project path] [out put path.format]
有了命令了,就應該解析了:
opts, args = getopt.getopt(sys.argv[1:], x, [scheme=])
參數從第二個開始算sys.argv[1:],因為第一個是yourFileName.py。getopt方法會把長參數名都拿出來給opts數組。opts數組中得每一個元素都是一個tuple的結構,第一個元素是長參數的名稱,第二個元素是長參數對應的值。-x後面的參數都放在args數組中。args的每一個元素都是一個字串,相當於[project path] [out put path.format]字串按照空格split成的字串數組。
走三步,1.cd。。。
跳轉到項目所在的目錄。參考這麼一句import os os.system(ls)可以執行ls命令。但是,這個卻不能執行“cd”命令。因為那個不能修改python主進程的工作目錄。用這個:
import osdirectory = your ios project pathos.chdir(directory)
2. archive
import subprocessarchiveCmd = xcodebuild -scheme + targetName + archive -archivePath + directory + targetName + .xcarchivesubprocess.Popen(archiveCmd, shell=True)
第一句就是拼一個字串。一個xcodebuild的命令字串,然後放到subprocess中執行。
3. 打包成ipa
ipaCmd = xcodebuild -exportArchive -exportFormat ipa + -archivePath + directory + / + targetName + .xcarchive + -exportPath + directory + / + targetName + .ipasubprocess.Popen(ipaCmd, shell=True)
和第二部一樣,拼一個字串把上一步中打好包的xcarchive重新打包成ipa並輸出。
so far so good?
這幾條命令分開執行,確實都不會有任何的問題。會在項目的目錄下產生一個build的目錄,在裡面可以找到我們在前面兩部的命令中得到的xcarchive檔案和最後輸出的ipa檔案。很好,都放在python的檔案中按照我們預定的方式執行一次。python yourFileName.py -scheme yourSchemeName -x youriOSPeojectPath。執行之後會輸出滿螢幕的xcodebuild的輸出內容。但是看看專案檔夾下,沒有ipa檔案!
原來,subprocess執行命令的時候,xcodebuild命令沒有執行完成就已經返回了。也就是ipa打包的命令執行的時候上一步的命令還沒有執行完,xcarchive還沒有產生。這一點很好解決,python給subprocess提供了一個wait方法。等命令全部執行完了再執行下一步。
process = subprocess.Popen(archiveCmd, shell=True)process.wait()
so far so good!
這個時候就算是全部的問題都解決了。代碼在這裡。Python語言本身非常的靈活。在這一代碼上可以很容易擴充出其他的功能。比如定時執行,編譯或者打包不成功發送通知訊息等。