Tools to Manage Your React Native Projects

RN 项目大部分人都知道是基于 Javascript 的,懂 js 就可以写了。但实际上并没那么简单。大概总结下这里面的问题,主要从管理项目的角度来说。

NPM

JS 部分肯定是不能避免的,js 依赖重这个估计都知道, node_modules 被很多人吐槽了。package.json 里面写的依赖,一般都不会写死版本(这个我估计很多人都没有注意到),例如下面这个片段

    {
       "crypto-js": "^3.1.9-1",
        "geodesy": "^1.1.2",
        "immutable": "^3.8.2",
        "moment": "^2.19.1",
        "react": "16.5.0",
    }

里面 geodesy 写的是 ^1.1.2 表示的是最低是这个版本,小版本号可以比这个大。 react 是写死版本号的。版本号不写死会产生一个问题,每次新安装的时候,如果有了新版本,那可能就会安装新的版本。即使你把自己的依赖都写死版本号也没有用,你依赖的依赖可能还是没有写死的。这样怎么办?

NPM 提供了 npm.lock 来管理版本,第一次使用 npm 安装的时候,会自动产生一个 npm.lock ,后面每次执行安装的时候,会根据这个里面规定的版本号来安装依赖。这样基本可以保证总是一样的版本。但是早期我使用 npm 的时候有一个问题,执行安装的时候居然还会修改 npm.lock ,我记得是会改里面的 hash 值,即使影响不大,但是每次提交修改 review 的时候都需要看看这个里面的东西就有点恶心了。所以后面我们换了 yarn,yarn 使用的是 yarn.lock 他执行安装的时候不会修改这文件里面的东西。(npm 我之后就没用了,所以后面讲的主要以 yarn 为准。)这样有了 lock 文件之后,表示所有依赖都有了确定的版本。

那么如何升级其中某一个依赖呢?方法很简单,删除 yarn.lock 里面关于这个模块的那条信息,然后执行 yarn install 就可以。当然,能升级到什么版本取决于这个模块是怎么被依赖的,如果是指定版本号的那种,那显然是不会有什么效果的。如果升级到的版本不满意,那只能看看依赖他的模块是不是可以升级一下,依赖新的版本,否则没什么办法了。

如果是写在 package.json 里面的依赖,那你可以使用 yarn add module 再次执行一下添加动作就可以。

Cocoapods

iOS 的部分,目前我看 react-native link 已经可以自动处理使用 cocoapods 了。使用 cocoapods 管理项目比较好,能使用尽量使用,能减少你很多麻烦。

cocoapods 可以通过 pod repo update 来更新本地的缓存,用过的都知道这个东西巨大一个,是放在 ~/.cocoapods 下面的。还好这个东西是全局的,不像 node_modules 是每个项目一个。想要更新一些 pods 新的版本必须先更新这个。

显然,这个东西也可能有依赖,你加一个 RN 模块,比如什么 react-native-umeng,那他就一般会依赖友盟的几个 pod(当然也可能有二货直接把依赖下载了放到项目里面),依赖也会有版本问题。所以有一个 Podfile.lock 来管理版本。

如果是 RN 模块自己加的依赖,通常他会在自己的 podspec 里面写好依赖的版本,所以升级版本需要先升级这个模块。

有的 RN 模块可能不是通过 pod 管理的,一般会需要你自己去 Podfile 里面添加依赖,以及还需要你手动把这个模块加入到你的 xcode 项目文件里面,还需要添加对应的编译依赖(这也是为啥推荐 pod 管理,省事多了)。

你自己去更新的时候,执行 pod update 就可以一次把依赖都升级到最新版本,也可以直接删除 Podfile.lock 文件,重新执行一下 pod install

Android

Android 部分的依赖似乎问题一般不是出现在 jar 包依赖上面,maven 处理还可以,除了有时候连不上源,这个可以配置换换源。

主要可能会出现在 gradle 上面。gradle 又会和 build-tools 这些挂钩,然后和 buildsdk 啥的这些产生关系。不过还好,Android studio 里面一般会提示的比较好,而且出问题也比较好搜,所以也不多说了。

Fastlane

我使用 Fastlane 来发布代码,再加上 Ansible,把从 repo 下载打包上传到编译好的文件到服务器,还有打发布 tag 这些事情都一条命令处理了。

fastlane 本身是 ruby 的。给 RN 项目配置 fastlane 需要分开 ios 和 android 两个,各自管理的。fastlane 自己也有依赖,以及你可能会装几个 fastlane 的 plugin 那他们也有自己的依赖。这个是通过 Gemfile 来管理的,同样也有一个 Gemfile.lock 文件。安装是通过在这个目录里面 bundle install 命令,这个命令会按照 lock 文件给你安装,如果没有会自动生成一个。

这样如果你需要升级依赖,可以删除 Gemfile.lock 然后执行一下 bundle install ,会自动再生成一个。

Gems

可以看到,上面 CocoaPods 和 Fastlane 都是基于 ruby 的。Mac 系统自带了一个 ruby,如果直接使用 gem 命令,会安装到系统的 ruby 下,我使用 brew 安装的 ruby。

你安装的这些 gem,比如 fastlane,cocoapods 这些也都会涉及到升级,比如 gem install fastlane 这样可以升级。可以使用 gem list 看看你系统上面安装的 gem,同一个包是允许同时存在不同的版本的。使用 gem cleanup 可以清理所有的旧版本。

这里需要注意,我们前面的 Podfile.lockGemfile.lock 里面都是写了包的版本的,清理之后你可能会发现这些工具不好用了,怎么办?方法就是把这个文件删除,然后重新执行 pod installbundle install ,要注意这个操作可能会同时把你的依赖直接升级了。如果是 pod 升级那可能就需要重新打包发布了。