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