react-native@0.50.1 依赖的是 facebook 精简之后的 boost_1_63_0 版本,而不是官方在 sourceforge 上发布的那个版本。

官方发布的版本是这样的。

curl -Lo boost_1_63_0.tar.gz \
    https://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.gz

shasum -a1 boost_1_63_0.tar.gz   # macOS, = 2cecf1848a813de55e5770f324f084c568abca0a
sha1sum boost_1_63_00.tar.gz     # Linux, = 2cecf1848a813de55e5770f324f084c568abca0a

而 Facebook 自己改过的版本是这样的。

curl -Lo boost_1_63_0.tar.gz \
    https://github.com/react-native-community/boost-for-react-native/releases/download/v1.63.0-0/boost_1_63_0.tar.gz

shasum -a1 boost_1_63_0.tar.gz   # macOS, = c3f57e1d22a995e608983effbb752b54b6eab741
sha1sum boost_1_63_00.tar.gz     # Linux, = c3f57e1d22a995e608983effbb752b54b6eab741

这是个比较大的坑。

依赖第三方开源 lib,文件名与第三方官方 release 的文件名一致,内容却是自己修改过的。稍不注意就会上当。

因为之前有习惯先通过别的途径下载这个大文件,手动放置到 ~/.rncache 缓存目录下,所以发现了这个问题。


补充说明,为什么说这是一个坑。

react-native run-ios

在模拟器上运行 ios 版本的时候,脚本会首先编译 ios 版本的 app 出来。从安装脚本 node_modules/react-native/scripts/ios-install-third-party.sh 文件最后部分可以看到,会下载编译 ios 版本所需要的几个第三方库并编译。其中就包括了 boost_1_63_0.tar.gz 这个第三方库。

在一个多月前,大约 react-native@0.48.x 版本的时候,facebook 还是依赖的官版 boost_1_63_0,可能是发现某些国家的码农反映比较强烈,因此转成依赖自己精简过后的 boost_1_63_0。官版的 boost_1_63_0.tar.gz 文件有 93MB 之大,某些国家的码农无论访问 sourceforge(boost 官版的发版平台)还是 github 都很慢,几乎所有要在新环境运行项目(包括想要尝鲜)的码农们都遇到过下载这个大文件失败的情况。一个第三方依赖库下载失败,错误信息常常隐藏在大段大段的日志中,尝鲜的人容易漏掉,并且造成一种『ReactNative 不成熟,「Hello World」都不容易跑起来』的第一印象。有经验的码农们能发现这个问题,也不容易解决。即便有能力找到快速的源预先下载好依赖,自动化构建的过程被破坏了,也是一种非常糟糕的体验,对一个开源的框架来说,不能容忍。

所以,从前段时间开始,大约是 react-native@0.50.x,Facebook 开始使用一个精简版的 boost 库。就像 google 自己的 boringssl 库 一样,facebook 以社区的名义为了这事儿维护了一个自己的版本。好在,目前来看,仅仅是一个精简官版的工作,还不涉及到修改。

出发点是一个好事儿,但是这么一来,增加了项目管理和维护风险。起步的小伙伴们,要小心一点。