級別:★★☆☆☆
標簽:「Xcode 10」「xcodebuild」「UseModernBuildSystem」
作者: Xs·H
審校: QiShare團隊
前言:
New Build System (Preview)
最早在Xcode 9中出現(xiàn)。相較于之前的Legacy Build System
,New Build System
能夠大幅度提升編譯速度,同時更嚴格地檢測代碼質(zhì)量(循環(huán)引用等)和更友好地給出提示。但在Xcode 9中,New Build System
還不是默認項,沒有被廣泛使用。升級到Xcode 10后,New Build System
替換Legacy Build System
成為了默認項(通過File -> Project Settings
可查看,如圖1)。
作者所維護的項目中有打包framework的功能,在升級到Xcode 10之前,打包腳本可以正常使用(如圖2),而在升級到Xcode 10之后,打包腳本失效了(如圖3)。
打包腳本如下:
# 合并在真機和模擬器上編譯出的QiShareSDK
# 如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME
FMK_NAME="QiShareSDK"
# INSTALL_DIR 是導(dǎo)出framework的路徑
# 在工程的根目錄創(chuàng)建framework的文件夾.
INSTALL_DIR=${SRCROOT}/QiShareFrameworks/${FMK_NAME}.framework
# 合成framework后,WRK_DIR會被刪除
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# Clean兩個架構(gòu)的framework
xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# 刪除之前生成的framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# 合成
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
# 刪除 WRK_DIR
rm -r "${WRK_DIR}"
# 打開 INSTALL_DIR
open "${INSTALL_DIR}"
編譯出的正常framework(framework中有內(nèi)容):
編譯出的錯誤framework(framework中無內(nèi)容):
根據(jù)經(jīng)驗,猜測是新的編譯系統(tǒng)導(dǎo)致的。果然,在將File -> Project Settings
中的Build System從New Build System
改為Legacy Build System
后,問題就解決了。
但這樣一來,會導(dǎo)致整個項目都無法使用New Build System
,這不是作者希望的,想必也不是開發(fā)者們和Apple希望的。所以,如果能夠單獨指定framework打包過程不使用New Build System
,將會是一個不錯的解決方案。
通過檢索和試驗發(fā)現(xiàn),我們可以使用-UseModernBuildSystem=NO
來指定xcodebuild
命令不使用當前的編譯系統(tǒng)。所以,作者對打包腳本xcodebuild
命令行進行了調(diào)整,如下:
xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build -UseModernBuildSystem=NO
xcodebuild OTHER_CFLAGS="-fembed-bitcode" -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build -UseModernBuildSystem=NO
然后,在New Build System
下運行腳本,發(fā)現(xiàn)可以正常打包了,問題得以解決。
PS:新系統(tǒng)升級后,QiShare總結(jié)了一些問題,但也有沒總結(jié)到的。歡迎朋友們留言討論。
1.升級Mojave后,Xcode10啟動模擬器后無法運行程序了,怎么辦?
2.在iOS 12中無法獲取WiFi的SSID了?別慌!
了解更多iOS及相關(guān)新技術(shù),請關(guān)注我們的公眾號:
關(guān)注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)
推薦文章:
如何假裝很懂工業(yè)物聯(lián)網(wǎng)?
iOS 編寫高質(zhì)量Objective-C代碼(六)