你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 動手搭建 iOS CI 環境之「了解 xcodebuild 命令」

動手搭建 iOS CI 環境之「了解 xcodebuild 命令」

編輯:IOS開發基礎

1.jpg

作者:@webfrogs

CI 也就是持續集成,是一種軟件開發實踐。通過自動化構建來將軟件系統集成後盡早交付測試來發現問題。

在 iOS 開發中,如果需要把工程打包成 ipa 文件,通常的做法就是在 Xcode 裡點擊 「Product -> Archive」,等待整個工程 archive 後,然後在自動彈出的 「Organizer」 中進行選擇,根據需要導出 ad hoc,enterprise 類型的 ipa 包。雖然 Xcode 通過提供的 GUI 操作已經屏蔽了大部分的細節,但作為一個偷懶的程序員,當然只是想簡單的執行一個命令,然後坐下來惬意地喝一杯茶,靜靜等待整個過程的完成。那 xcodebuild 這個命令就是來完成這個事情的。

目前已經有不少封裝得很不錯的第三方打包服務可以用,比如最出名的有 AFNetworking 的作者 mattt 大大的 shenzhen (沒錯,就是深圳),還有一個名叫 gym 也很不錯。這些庫都是對 xcodebuild 這個命令做了一些封裝,更方便使用而已。

xcodebuild 使用方法

xcodebuild 命令是 Xcode Command Line Tools 的一部分。通過調用這個命令,可以完成 iOS 工程的編譯,打包和簽名過程。這個命令隨著 Xcode 的版本不同使用方法上也會有所不同。打開命令行,調用以下命令查看使用方法

xcodebuild --help

雖然這個命令屏蔽了大量編譯器的細節,實際使用起來還是較為繁瑣,使用的話最好還是對其做一層封裝,來更方便地使用,這個之後的文章裡再細說。

blob.png

上面截圖中顯示了命令執行結果。當前環境是目前最新的 Xcode 7.1。

Archive 工程

我們就根據顯示的幫助信息來調用命令完成整個打包的過程吧。首先需要了解的是,archive 工程後,實際上我們是把整個工程編譯,然後簽名,變成了一個後綴名為 xcarchive 的文件。通過調用以下命令,我們將整個工程編譯,簽名,然後將生成的 xcarchive 文件放到工程根路徑下的 build 文件夾裡。

xcodebuild -scheme  -archivePath build/.xcarchive archive

參數說明:SchemeName 就是工程的 scheme 的名字,在 Xcode 中可以看到。如下圖

blob.png

如果工程使用了 Cocoapods 來管理第三方庫,那麼命令的執行方式上有所不同,因為 Cocoapods 會把工程變成一個 workspace。將 workspace 工程 archive 的命令如下。

xcodebuild -workspace  -scheme  -archivePath build/.xcarchive archive

這個命令和上面的命令區別就在於需要指定 workspace 的文件名。

上面這兩個命令適用於不同類型的工程: workspace 或者非 workspace。執行中讀取的配置都是在工程的 Target 或者 Scheme 中設置好的配置。比如,archive 進行編譯的是 release 環境,這個在工程的 scheme 中可以看到。而簽名的證書默認也是在各個 Target 的 Build Setting 中的配置。

命令中可以添加一些參數實現在命令執行時配置不同的環境。比如,如果想 archive 出 Debug 環境的包,那麼就可以在命令中添加 -configuration Debug 參數。對於非 workspace 的工程,還可以通過添加 PROVISIONING_PROFILE=的參數來指定簽名所用的 Profile 文件,參數的值為 profile 文件的 UUID。

注意:如果下一步中需要導出的是 enterprise 類型的 ipa 包,則導出過程中使用的 profile 文件中指定的 identifier 一定要和相應的 target 的 Bundle Identifier 完全一樣,不能使用包含通配符 * 的 profile

小提示:如果 archive 命令無法執行成功, 則可以在 Xcode 中通過點擊「Product -> Archive」來查看產生問題的原因。如果 Xcode 中操作沒有問題,那麼 archive 命令也是可以正確執行的。

導出 IPA

接下來就是將上一步生成的 xcarchive 文件導出,生成 ipa 文件。這裡需要用到的命令是 xcodebuild -exportArchive。

從上面的幫助文件中可以看到命令的使用方法。這裡需要注意的是,目前的 Xcode 7 中此命令的使用已經變成使用 -exportOptionsPlist 的參數形式了。這種形式支持 bitcode 的功能。但在實際的使用中,我發現使用這種形式我們工程並不能正確導出 ipa 包。原因我暫未找到,關於 xcodebuild 的資料也真是少的可憐。我猜測是我們工程未使用 bitcode 導致。所以我改為使用了 Xcode 6 時代的 -exportFormat IPA 參數來完成導出 ipa 包的功能。

xcodebuild  -exportArchive -exportFormat IPA -archivePath  -exportPath

參數說明:archivePath 就是上一步生成的 xcarchive 文件的路徑。exportPath 就是導出的 ipa 文件路徑。

如果導出的 ipa 中要更換 profile 文件,也就是需要修改上一步中 archive 文件用於簽名的 profile 文件,有兩種方式可以完成這個任務。

一種方式是直接指定新的 profile 文件,用法是添加參數 -exportProvisioningProfile這種用法適用於只有一個 target 的項目。

如果工程中有多於一個的 tagert, 比如提供了 watchkit 的功能。由於 watchkit 和 watchkitextension 的 target 也分別需要不同的 profile,需要使用第二種形式的參數, -exportSigningIdentity只要相關的 profile 文件已經正確安裝,那麼就可以導出需要的 ipa 文件。 identity 可以在 Keychain 中找到。如下圖

blob.png

實例

以一個實際工程舉例,該工程的名字叫 Tyrion。Scheme 名字也是 Tyrion。 那麼 archive 的命令如下

xcodebuild -scheme Tyrion  -archivePath build/Tyrion.xcarchive archive

導出 ipa 包的命令如下

xcodebuild  -exportArchive -exportFormat IPA -archivePath build/Tyrion.xcarchive -exportPath build/Tyrion.ipa

依次執行完這兩個命令後,工程根路徑下的 build 文件夾內容如下圖。

blob.png

後續

導出 ipa 包後,就可以利用 iFunBox 之類的軟件直接安裝到對應的 iPhone ,或者利用 items-service 協議來遠程安裝。

就整個 CI 環境搭建來說,能夠通過命令行正確導出 ipa 包只是完成了第一步,要完成整個自動化構建,還需要能夠自動將 ipa 包發布出去。這篇文章就到此為止啦~~


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved