首發佈於公衆號 iOS 知識小集。git
蘋果隨着 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。github
回顧一下 new build system,從 Xcode 10 開始,能夠從**Xcode-> Files-> Project/Workspace Settings**激活 new build system,咱們能夠在 legacy 和 new build system 之間切換。swift
查看以前關於 Xcode new build system 的 blog post 得到詳細信息。若是你用 xcodebuild
在命令行裏編譯 iOS 工程,咱們不得不傳入額外的參數 -UseModernBuildSystem=YES
強制使用 new build system。new build system 叫 xcbuild
。蘋果的 xcbuild
二進制文件路徑以下所示。xcode
/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 應用中每一個受影響的範圍分類這些問題。bash
當一個 iOS 工程使用 New Build System 編譯,一些基於 info.plist 文件的問題開始出現。這裏有一些基於 New Build System 和 Info.plist 文件的規則你必須知道。app
任何 target 的 Copy Bundle Resources 編譯階段不該該有任何 plist 文件。不然 new build system 不會編譯 app。另外,bundle 裏的文件被複制屢次,編譯也不經過。工具
new build system 在 clean 後和增量編譯中運行 info.plist 具備不一樣的優先級。clean 後編譯,info.plist 在處理資源文件以後,連接 storyboard 以前,然而增量編譯在簽名以前。post
若是目標在僅在 Info.plist 有值,沒有任何 Xcode 的引用文件目錄,Xcode 編譯系統編譯失敗。性能
###2] CocoaPodsui
iOS 工程有一些使用 CocoaPods 產生的問題。一些常見問題是:
簡言之,Cocoapods 和 New build system 在一塊兒工做工做不太好。
使用 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。
使用 new build system,Xcode 的 clean 操做被廢棄了,推薦使用 Clean Build Folder
操做。新的推薦的操做移除全部 iOS 應用的派生數據,引起從零開始乾淨的編譯。這意味着若是你使用 Cocoapods,這會從零開始從新編譯全部的 frameworks,在編譯 iOS 工程時形成巨大的延時。若是你使用 Carthage 預編譯 frameworks,不會有那麼大的影響。若是你有 clean 編譯的習慣,你須要特別關注這個等等待。同事也會面臨緩慢的 Xcode 索引問題。
開發者大多會使用 .xcconfig
文件在某處爲特殊的 targets 保持 Xcode 編譯設置。這裏有一些問題,在 xcconfig 文件裏設置的一些條件變量可能不按逾期生效,致使編譯失敗。爲了檢查你的 xcconfig 文件,蘋果推薦運行下面的命令。
defaults write com.apple.dt.XCBuild EnableCompatibilityWarningsForXCBuildTransition -bool YES
若是這個命令報任何警告和錯誤,咱們須要修復它,得到穩定的編譯。
蘋果 new build system 爲了提升 Swift 編譯的性能,穩定性和可靠性。它會在應用開發早期階段捕獲配置錯誤。Xcode 10 已經默認開啓,不久以後咱們就不得不更新咱們的編譯過程以適應 new build system。能夠確定的是,它會爲 app 中帶來不少提高。你已經轉向 new build system 了嗎?你有什麼經驗嗎?你遇到過文中未說起的其餘問題嗎?