自從 Xcode 更新到 10, 還沒有運(yùn)行過 RN 項(xiàng)目, 一打開項(xiàng)目運(yùn)行, 報(bào)各種莫名其妙的錯(cuò)誤. 國(guó)內(nèi)的網(wǎng)站各種答案混淆視聽, 反正我是沒找到解決方法, 在 RN 官方Github 中, 找了好久, 才解決, 在這里做一下記錄.
1. 問題怎么出現(xiàn)的?
在 Terminal 新建一個(gè)測(cè)試項(xiàng)目.
react-native init DemoObject
在 Terminal 中運(yùn)行, 或者直接點(diǎn)擊 Xcode項(xiàng)目入口文件 DemoObject.xcodeproj, 運(yùn)行程序.
react-native run-ios
在默認(rèn)情況下(啥也不改), 程序會(huì)直接報(bào)錯(cuò), 如果你是在 Terminal 中運(yùn)行, 會(huì)直接看到下面這兩個(gè)錯(cuò)誤.
'config.h' file not found
":CFBundleIdentifier", Does Not Exist
2. 問題怎么解決的?
這兩個(gè)問題其實(shí)挺莫名其妙的. 在官方的 issue 中, 很容易找到類似的解答. 但能完美解決問題的, 沒有. 主要是我覺得信息太雜了, 所以以此篇文章做一下記錄.
大致的解決思路如下:
-
我們需要切換 Xcode10 的默認(rèn)編譯系統(tǒng). 默認(rèn)是
New Build System, 我們需要切換為Legacy Build System, 為什么最新版的 RN (0.57) 不支持 Xcode10 的新編譯系統(tǒng), 目前還不知道.
image.png 手動(dòng)安裝第三方腳本.
- 刪除 rncache, 清理緩存文件
$ rm -rf node_modules/ && yarn cache clean && yarn install and rm -rf ~/.rncache
- 在 rncache 文件夾中 安裝第三方文件
$ cd node_modules/react-native/scripts
$ ./ios-install-third-party.sh
上面這個(gè)腳本文件會(huì)直接把第三方文件安裝到 .rncache 文件夾中.
如果網(wǎng)速差, 可以按照下面手動(dòng)下載安裝.
folly-2016.10.31.00
double-conversion-1.1.5
glog-0.3.5
boost_1_63_0
Xcode Build
一開始third-party這個(gè)文件夾是沒有的, 切換完 Xcode10 的編譯系統(tǒng)后, 再次編譯項(xiàng)目, 程序會(huì)自動(dòng)創(chuàng)建third-party文件夾, 從.rncache文件夾中把所有需要的文件解壓拷貝到third-party文件夾中.配置 glob 文件.
$ cd <Your-Project-Folder>/node_modules/react-native/third-party/glog-0.3.5
$ ../../scripts/ios-configure-glog.sh
- Xcode Build.
經(jīng)過上面的步驟, 目前應(yīng)該能解決問題.
注意
- 在解決上面的問題之前, 最好把
node.js升級(jí)到最新.
$ brew upgrade node
- Xcode10 一定注意要切換到
Legacy Build System, 才編譯項(xiàng)目. 這個(gè)直接涉及到從 rncache 拷貝過來的文件. 我嘗試過用默認(rèn)的system編譯項(xiàng)目, 會(huì)報(bào)錯(cuò). - 如果你編譯項(xiàng)目
third-party文件夾沒有自動(dòng)生成, 建議你手動(dòng)把當(dāng)前項(xiàng)目中的node_modules文件夾刪掉, 重新加載第三方庫. 此方法我屢試不爽.
$ yarn install
- 如果下次你再需要?jiǎng)?chuàng)建新項(xiàng)目, 你不需要頻繁更新
.rncache, 目前這個(gè)文件沒什么變化. 你需要做的最重要的是:
配置glob文件
配置glob文件
配置glob文件
重要的事說三遍.
參考
'config.h' file not found when I upgraded xcode10
When new Xcode build system is used, Xcode build fails to download third-party dependencies
