主角:大概有 20 個庫
起因:前段時間在給某 App 做元件化,發了一堆奇怪的 CocoaPods 庫,今天到了某個版本釋出,然後將這些庫引入了主工程,用測試機進行編譯 / 打包 / 提測,嗯,沒有任何問題,開心。然後釋出系統編譯打包,嗯,失敗了。編譯失敗嘛,很正常,查日誌啦。唉,開啟日誌發現,並沒有返回任何錯誤日誌…啥情況?調了一天,無果,找 CI 大佬們幫忙解決,然後發現打包系統是用直接下載 zip 壓縮包的方式進行編譯的,沒有走 git,我們心想:有什麼不同麼,本地都能編譯成功啊?然後試了試,臥槽,真的編不過,然後為啥不返回錯誤資訊的問題也找到了,因為 Xcode 真的沒有返回錯誤資訊啊喂!
如上圖所示,就一句:
Build operation failed without specifying any errors. Individual build tasks may have failed for unknown reasons.複製程式碼
展開以後的詳情為:
Build operation failed without specifying any errors. Individual build tasks may have failed for unknown reasons.One possible cause is if there are too many (possibly zombie) processes;
in this case, rebooting may fix the problem.Some individual build task failures (up to 12) may be listed below.複製程式碼
然後就開始了一下午的排錯之路…
經過:
-
一開始,我們懷疑是本地 CocoaPods 版本和 CI 伺服器的 CocoaPods 衝突導致的,然後發現服務端沒有安裝 CocoaPods,壓根不需要
pod install
操作。 -
然後我們嘗試在本地重新
pod install
,覺得可能是我們哪裡快取沒清除,當然,經過了半小時的掙扎後後我們排除了這個愚蠢的想法; -
之後我們對比了最近的幾次提交,觀察到
Build Phases
中的[CP] Copy Pods Resources
部分,貌似有大量的資原始檔引用方式的變更,遂發現,貌似有資原始檔被重複引用了唉…
最後發現,若 CocoaPods 庫中資原始檔夾(預設是 Assets)中包含 .xcassets 型別的檔案,則不能使用 s.resources = ‘[庫名]/Assets/**/*’ 遞迴引用所有檔案,這樣會造成對 .xcassets 檔案中資原始檔的重複新增,反正由於一系列奇怪的原因最後會導致我們的 CI 無法正常編譯和打包我們的 App。
這個問題十分具有隱蔽性,因為我們在本機編譯 / 打包 / Lint / Push 是完全沒有問題不會報任何錯誤的,所以如果資原始檔夾中包含 .xcassets 型別的檔案,只能指定一級目錄的包含 s.resources = ‘[庫名]/Assets/*’ 或者麻煩一些,手動指定 / 匹配所有資原始檔。
接下來的工作就簡單(並不)了,排查所有的 Pod 庫,把資源引用方式有問題的庫進行修改 / Lint / PR / 發版 / 引入,然後就浪費了一天的時間,開心(並不),?。
結論:原來 Xcode 還可以在不報任何具體錯誤的情況下強行構建失敗…
如有任何智慧財產權、版權問題或理論錯誤,還請指正。
https://juejin.im/post/5a67544a6fb9a01ca10b1072
轉載請註明原作者及以上資訊。