解决cnpm私服无法安装react-native的问题

起因

需要在RN项目中安装react-native的依赖,由于项目package.json中既有对私有库的依赖,也有对第三方库的依赖,因此本地镜像地址使用的是私有cnpm仓库(2.10.0)。但是在安装react-native的时候,其中一个RN依赖的库metro无法安装,报No compatible version found: metro的错误,导致RN也安装失败。

一些尝试

首先google一下错误信息,发现这也是个常见错误,但不同的库错误原因不一样,无法聚焦,所以没有继续深入看这个问题。

然后去cnpm私服的web端做了一个同步metro的操作http://cnpm-web.jinhui365.cn/sync/metro,发现报错ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value:,把这错误在google了一下,第一个结果中的问题与这个错误非常一致,最高赞的回复也很明确,是因为mysql的某个字段使用的是utf8编码,只能支持3个字节,改成utf8mb4编码就可以了。

处理步骤

修改cnpm源码

  1. 将数据库编码和表的编码都改成utf8mb4

  2. 修改models/module.js文件,在module定义的options中增加charset: 'utf8mb4'的配置

  3. 修改common/sequelize.js文件,config.database的定义中,增加dialectOptions: {charset:'utf8mb4'},的配置

  4. 在根目录执行bin/nodejsctl stop,bin/nodejsctl start重启服务。

  5. 尝试通过cnpm私服安装react-native,正常通过