Xcode 10 新編譯系統你需要了解的 5 個特性
首發佈於公眾號iOS 知識小集。
蘋果隨著 Xcode 9 的 preview 模式釋出了 Xcode New Build System ,預設是不開啟的。Xcode 10 中預設是開啟的,在你的已有工程中適應 new build system 可能面臨一些問題。蘋果完全意識到其中的一些問題,然後建立了獨立的關於 new buiuld system 釋出說明。我們在之前的blog post 中覆蓋了 new build system 的內部細節,我們將要覆蓋 iOS 開發者可能會遇到但蘋果的釋出說明中沒有詳細介紹的前 5 個問題,例如使用第三方工具 build new system。
Xcode 10: New Build System
回顧一下 new build system,從 Xcode 10 開始,可以從** Xcode-> Files-> Project/Workspace Settings **啟用 new build system,我們可以在 legacy 和 new build system 之間切換。

檢視之前關於 Xcode new build system 的blog post 獲得詳細資訊。如果你用 xcodebuild
在命令列裡編譯 iOS 工程,我們不得不傳入額外的引數 -UseModernBuildSystem=YES
強制使用 new build system。new build system 叫 xcbuild
。蘋果的 xcbuild
二進位制檔案路徑如下所示。
/Applications/Xcode.app/Contents/SharedFrameworks/XCBuild.framework/Versions/A/Support/xcbuild 複製程式碼
New Build System 並行執行目標和構建階段以加速整個 swift 編譯。一旦從 Xcode 啟用,我們將會開始從我們的 iOS 工程中的 new build system 中獲益,同時遇到相關問題。我們將會介紹 Xcode New Build System 帶來的常見問題和解決這些問題的潛在解決方法。我們將按照在 iOS 應用中每個受影響的範圍分類這些問題。
1] info.plist
當一個 iOS 工程使用 New Build System 編譯,一些基於 info.plist 檔案的問題開始出現。這裡有一些基於 New Build System 和 Info.plist 檔案的規則你必須知道。
-
任何 target 的 Copy Bundle Resources 編譯階段不應該有任何 plist 檔案。否則 new build system 不會編譯 app。另外,bundle 裡的檔案被複制多次,編譯也不通過。
-
new build system 在 clean 後和增量編譯中執行 info.plist 具有不同的優先順序。clean 後編譯,info.plist 在處理資原始檔之後,連結 storyboard 之前,然而增量編譯在簽名之前。
-
如果目標在僅在 Info.plist 有值,沒有任何 Xcode 的引用檔案目錄,Xcode 編譯系統編譯失敗。
###2] CocoaPods
iOS 工程有一些使用 CocoaPods 產生的問題。一些常見問題是:
- 開發中的 Pods 只在執行 clean 後的編譯更新。包含的 pods frameworks 編譯階段執行不穩定。Github 有一個相關 issue
- 打包 app 可能失敗,或者 app 內由於一些 Cocoapods 相關的編譯階段指令碼執行不可靠造成可能有不穩定的表現。
簡言之,Cocoapods 和 New build system 在一起工作工作不太好。
3] Run Script Phase
使用 new build system,你可能遇到 Run Script 階段開始失敗或是給出不穩定的結果。不要擔心,這是一個關於這個問題的一個好結果。
在 Xcode 10 中, run script 編譯階段提升了很多,然而,我們不得不通過為 run script 階段指定一些輸入檔案,幫助編譯階段處理。如果我們在 run script 階段指定輸入檔案,對編譯系統做出正確決定是重要的,就像 run scripts 需不需要被執行對於依賴的目標編譯。Xcode 編譯系統嘗試並行的執行一些任務,如果 run script 階段的輸入沒有被生成,編譯系統迷惑然後失敗。在適當的時候給 run scripts 提供輸入檔案始終是個好主意。隨著輸入檔案增多,Xcode 10 提供在 .xcfilelist
格式問題件指定所有輸入檔案的方式,我們能夠在 build phase 中以檔案列表的形式新增這些檔案。Xcode 編譯系統始終會在沒有輸入檔案,改變輸入檔案和丟失輸出檔案的時候執行 build phase。新增這些檔案是重要的,避免在不必須的時候為所有增量編譯系統執行這個 phase。
4] Clean Build Folder Action
使用 new build system,Xcode 的 clean 操作被廢棄了,推薦使用 Clean Build Folder
操作。新的推薦的操作移除所有 iOS 應用的派生資料,引發從零開始乾淨的編譯。這意味著如果你使用 Cocoapods,這會從零開始重新編譯所有的 frameworks,在編譯 iOS 工程時造成巨大的延時。如果你使用 Carthage 預編譯 frameworks,不會有那麼大的影響。如果你有 clean 編譯的習慣,你需要特別關注這個等等待。同事也會面臨緩慢的 Xcode 索引問題。
5] XCCONFIG Files
開發者大多會使用 .xcconfig
檔案在某處為特殊的 targets 保持 Xcode 編譯設定。這裡有一些問題,在 xcconfig 檔案裡設定的一些條件變數可能不按逾期生效,導致編譯失敗。為了檢查你的 xcconfig 檔案,蘋果推薦執行下面的命令。
defaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES
如果這個命令報任何警告和錯誤,我們需要修復它,獲得穩定的編譯。