Lean Engineer

リーンエンジニア〜効率的に実験しながら、技術を学ぶブログ

ReactNative 0.56.0へのアップデートがツラかったので、対応したことをメモ

 ReactNative 0.56.0でAndroidの予想変換時の絵文字入力でのクラッシュが治ってるとのことで、「さっそくアップデートだ!」と意気込んでいたのだが、泥沼だった。いろいろあったので、対応したことをメモしておく。アップデートはreact-native-git-upgradeコマンドで行っている。

pod installが失敗する

 まずは、pod installが失敗した。何個かReactNativeのアプリでアップデートを試して、2つのケースがあった。

third partyを記載してなかった問題

 あるアプリでは、PodfileにReactとyogaは記載していたが、third partyを記載してなかった。なぜ、これで以前まで動いていたのか謎だが、とりあえず0.56では動かなくなってしまった。

# Third party deps podspec link
  pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
  pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
  pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'

を記載して、pod installで動いた。

third partyを記載していたアプリで、Follyがエラーを出す

 あるアプリでは、third partyを記載していたので、以下のようなエラーがでた。

[!] CocoaPods could not find compatible versions for pod "Folly":
  In Podfile:
    React/CxxBridge (from `../node_modules/react-native`) was resolved to 0.56.0, which depends on
      Folly (= 2016.10.31.00)

None of your spec sources contain a spec satisfying the dependency: `Folly (= 2016.10.31.00)`.

You have either:
 * out-of-date source repos which you can update with `pod repo update` or with `pod install --repo-update`.
 * mistyped the name or version.
 * not added the source repo that hosts the Podspec to your Podfile.

Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.

 pod repo updateしても、同じエラーが出て動いてくれない。しかし、pod updateしたら動いた。よかった。

iOSビルドでglogがエラーを出す

 pod installもできたし、ビルドするぞー!って思ったら、エラー。悲しい。

glog-0.3.4/src/base/mutex.h:105:10: fatal error: 'config.h' file not found

 調べていたら、解決策を見つけた。良かった。

cd node_modules/react-native/third-party/glog-0.3.4
./configure
make
make install

 これで、iOSは無事ビルドができた。

Androidのビルドができない

 Androidをビルドしようとすると下記のようなエラーがでる

* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugApk'.
   > A problem occurred configuring project ':react-native-billing'.
      > The SDK Build Tools revision (23.0.1) is too low for project ':react-native-billing'. Minimum required is 25.0.0

 react-native-billingというライブラリでのエラーだが、これだけではなく、ほぼすべてのライブラリで同様のエラーが出る。調べていたら、解決策を見つけた。見つけるの大変だった。Androidのネイティブ開発したことないので、こういうエラーはキツイ。

 android/build.gradleに下記を追加

subprojects {
    afterEvaluate {project ->
        if (project.hasProperty("android")) {
            android {
                compileSdkVersion 26
                buildToolsVersion '26.0.3'
            }
        }
    }
}

ReactNative側のエラー

 これで、iOSもAndroidもビルドができたぞー!と思ったら、ReactNative側のエラーに何個か遭遇した

babel-preset-react-nativeが古い

error: bundling failed: TypeError: Cannot read property 'bindings' of null

 何だこのエラーはと思い調べてたら、issueがたっていた。babel-preset-react-nativeが古かったみたい。

npm i -U babel-preset-react-native@5.0.2 --save-dev

reactotronがエラーを出す

Unknown named module: 'NativeModules'

 という、何がエラーを出してるのかわからない状態になった。どうも調べていくと、reactotronの問題みたいだ。最近、reactotronのv2が出るリリースされるタイミングで治ってる?みたい。

 ただ、僕が修正したときはv1系で、まだ対応がなされていなく、アップデートするのもめんどくさかった(そもそもreactotronを使ってなかった)ので、reactotronを使っているところをコメントアウトした。気が向いたら、v2にアップデートしてみようと思う。

allowFontScalingが設定できない?

Cannot set property 'allowFontScaling' of undefined

 というエラーが出た。なんだこれは、と思っていたら、下記のコードがまずかったようだ。defaultPropsって使えなくなったのかな?とりあえず、コメントアウトした。

Text.defaultProps.allowFontScaling = true

 

ReactNative 0.56にアップデートしたぞ

 僕のアプリでは、上記の対応で、ReactNative 0.56へアップデートできた。Androidのクラッシュバグが減ったので、対応してよかった。