谈谈依赖的版本控制配置

项目中引用第三方包你一般会在什么时候更新呢?是一旦用了某个版本就再也不会更新?还是一有新版本就马上更新?还是定期检查release note,根据自己的需要更新?

在一个React Native项目中,考虑到React Native升级的很频繁,于是团队决定,我们会固定一个React Native版本,每过一个阶段之后,由团队中一个人去完成升级工作。等这个人本地的升级完成,测试通过后,将升级后的代码上传,其他人再基于最新升级后的代码做相关的Feature。

这个故事就发生在一次React Native的升级过程中。

修改依赖的版本控制配置

由于Jest现在需要react native 至少0.30.0的支持了,目前ReactNative的最新稳定版本在0.31.0。
于是昨天就将React Native升级到了 0.31.0。

react-native@0.26.3 => react-native@0.31.0
react@15.0.2 => react@15.2.1

升级完之后,肉测了项目里所有为数不多的功能之后(等把Jest测试加上,就终于不用每次改点代码就心惊肉跳了),今天早上merge了,自信满满地提醒同事们可以升级了。

20分钟之后,反应来了,Berry说他本地升级完之后出现了很多这样子的warning:

Warning: You are manually calling a React.PropTypes validation function for the ‘bottom’ prop on ‘StyleSheet.fullScreen’. This is deprecated…

咦?怎么会酱紫?我本地怎么都没有?google 之

后来查到了这个 issue

这是react@15.3.0的bug,竟然出现在了Berry的机器上。。辣么。。

请Berry查了他本地的react版本,确认一下凶手。

npm ls react

结果就是 `react@15.3.0`

瞄一眼package.json

1
2
"react": "^15.2.1",
"react-native": "^0.31.0",

对!凶手只有一个!他就是! 我!。。

^15.2.1 意思是 15.2.1 <= version < 16.0.0,回想升级的过程

按照Official docs 执行的

1
npm install --save react-native@0.31

升级完之后,默认更新了 package.json, 都怪自己粗心没有留意版本。

最后方案是:把版本号固定,日后升级由某一个人单独做升级,并且解决了升级过程中出现的问题之后,所有人再一起upgrade,这样既可以达到升级目的,也可以划分明确的关注点,升级的人只做好升级,做功能的人专心做功能不用担心由于跑一遍 npm install 就跑出来莫名其妙的warning 和 error。

1
2
"react": "15.2.1",
"react-native": "0.31.0",

以此类推,修改类似 package.json 或者 gemfile 这种跟版本有关的配置时,一定要谨慎,特别是变化比较快的库,更是更加谨慎!