最近jenkins打包平台React Native打包一直报错。打包命令如下:
"build:android": "react-native bundle --entry-file index.js --platform android --dev false --bundle-output ./output/android/index.android.bundle --assets-dest output/android/res/",
"build:ios": "react-native bundle --entry-file index.js --platform ios --bundle-output ./output/ios/main.jsbundle --dev false --assets-dest ./output/ios/bundle/",
"build:test": "npm run build:android && npm run build:ios",
"build:production": "npm run build:android && npm run build:ios"
报错大致是什么模块找不到:Error: Cannot find module 'jest-haste-map'
于是乎执行:npm install jest-haste-map --save
之后再次报错:Error: Cannot find module 'jest-serializer'
执行:npm install jest-serializer --save
之后再次报错:Property right of AssignmentExpression expected node to be of a type ["Expression"] but instead got null
解决办法:修改package.json文件devDependencies增加,修改.babelrc文件
"@babel/plugin-proposal-decorators": "7.0.0-beta.47",
"babel-preset-react-native": "5.0.1",
之后还是报错,此时需要换一种思路了。因为自己打包平台的代码和本地的代码完全一致。为什么本地能打包,打包平台不能打包。究其原因,发现在提交RN代码的时候连本地的node_modules文件也一并提交到git上了。同时.gitignore文件里面忽略了build/文件夹。则所有的build文件都没有提交到git上。
于是到node_modules文件夹下面的jest目录下jest-haste-map文件夹下查看是否有相应库的代码。
再在本地node_modules文件夹相同目录下面查看是否有库的源码。
于是发现了,不是代码里面的问题,而是打包平台和本地的node_modules文件夹不一样,虽然打包平台在远程git拉取完最新的代码之后,执行npm install。npm install在执行过程中到对应package.json.lock文件中挨个安装依赖库,如果发现本地有对应的比如jest-haste-map文件夹,就去查看此文件夹下面是否有package.json文件,有则跳过安装。没有则安装,此时就发现是有的,但是编译打包的时候发现并不能引用到库里面的文件,所以报错。
所以得出结论本地提交代码的时候,一定不要把node_modules文件夹提交到远程git。每次打包的时候都去npm install挨个安装一遍,这样不会导致丢失。因为多人合作RN项目的时候,有可能大家在开发不同的模块,安装了不同的依赖库。都提交上去之后造成可能有很多模块的库文件里面都是空的。