之前 RN 在別的工程搞得好好的萌狂,因為另一個項目用了 Swift确憨,Podfile 里加了一行use_frameworks!
氧猬,項目突然就不能正常編譯了怀伦,為此是深深地蛋疼了兩天才搞定壁涎。凡恍。。
這兩天主要遇見兩個問題怔球,不知道算不算低級問題嚼酝,也不知道有沒有典型性,但是自己被卡了挺久竟坛,所以記下來以供日后查閱闽巩,若是能夠幫到大家那不勝榮幸。
- 第一個是靜態(tài)庫用得好好的項目在使用了
use_frameworks!
之后就報錯不能用了流码。
經(jīng)過多方查探之后最終成功定位問題出在項目的"Other Link Flag"里又官。修正后的樣子如下:
image.png
在使用靜態(tài)庫時這里是有一些-l"React"樣式的依賴,這些靜態(tài)庫依賴在使用了關(guān)鍵字use_frameworks!
之后并沒有被正確的刪除漫试,導(dǎo)致了依賴庫找不到的問題六敬。
刪除那幾個 React 相關(guān)依賴之后工程能夠正常運行。此時可以看到默認(rèn)的$(inherited)
關(guān)鍵字自動導(dǎo)入了-framework "DoubleConversion"字樣驾荣,這與能夠正常編譯的其他 React Native Swift 程序如官方教程里的 Swift-2048 是一致的外构。
- 第二個問題算是我的項目里特有的奇葩問題。因為大多數(shù)人進(jìn)行 RN 開發(fā)的時候目標(biāo)都是寫出純 RN 或者混編的 app播掷,而我的項目要求的是要開發(fā)混編的庫审编。
APP 開發(fā)容易,帶 RN 的庫的開發(fā)就有點坑了歧匈。
因為混合開發(fā)項目大多是 Cocoapods + React Native 的組合垒酬,而React Native 的依賴是由 React Native 本地注入的,并非從 GitHub 拉取件炉,所以開發(fā)出來的庫的RN 依賴并沒有寫入到 podspec 中勘究。
在使用這個庫的時候,很有可能報
React/RCTBridgeModule.h
file not found 的錯誤
畢竟這里是橫向依賴斟冕,和其他人遇到的 'react/rctbridgemodule.h' file not found 錯誤原因雖然都是找不到文件口糕,但是狀況和解決方法都是不同的。
一般遇到這個問題是因為 build 工程的時候使用了并行模式磕蛇,項目在 React build完成之前嘗試訪問景描,因此出錯十办,按照常規(guī)的取消并行,將 React 作為前置即可超棺。
而橫向依賴并不是常見情況向族,所以 React 再怎么build,它也是不可能找到 React 的说搅。
如果認(rèn)識到了這個問題的所在炸枣,就不難去找到其解決方法。畢竟 React 本身就不只是一個庫弄唧,它還包括了 DoubleConversion适肠、folly、yoga 等庫候引,所以直接去看 React 是怎么進(jìn)行橫向依賴的侯养,就能夠知道這個要怎么寫。
以我自己的項目為例澄干,需要在對應(yīng)的 Pods 中添加 React 的 framework 路徑:
當(dāng)然逛揩,因為通常 Pods 文件夾都是會被排除追蹤的,所以這么改了也只是本地能用麸俘,如果要在其他設(shè)備上編輯或者多人合作辩稽,那么需要修改 Podfile:
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == 'XXX'
target.build_configurations.each do |config|
if config.build_settings['FRAMEWORK_SEARCH_PATHS'] == nil
config.build_settings['FRAMEWORK_SEARCH_PATHS'] = ""
end
config.build_settings['FRAMEWORK_SEARCH_PATHS'] = config.build_settings['FRAMEWORK_SEARCH_PATHS'] + "\"$PODS_CONFIGURATION_BUILD_DIR/React\"" + " " + "\"$PODS_CONFIGURATION_BUILD_DIR/yoga\""
end
end
end
end
安全起見這里我加了判空,因為沒怎么寫過 ruby从媚,不知道有沒有更簡潔的寫法逞泄。
至于有沒有辦法能把自己開發(fā)的三方庫對 RN 的依賴寫進(jìn)podspec 里讓它自己去操作,我就不知道了拜效,以目前 RN 自己都是沒有使用 podspec 的操作手法來說喷众,估計還是不太方便吧。