一些背景
今年7月进入新公司,参与一个已有项目的UI(部分新功能)改造,在了解完原有项目的问题之后,决定新建项目去实现全新的UI和新功能(整个过程无比杂乱,准备写一篇文件分析这次改造的问题)。新项目使用React 18
+ React Router 5
+ Webpack 5
,CICD是公司自建的内部工具。
本地运行和打包没问题,但流水线构建报错
报错排查阶段1 - node版本过低
查看流水线构建实例的报错日志,其主要的报错问题是:
- npm install 报错:package-lock.json lockfileVersion 报错
- npm build 报错:Module Not Found和SCSS文件打包失败
1 | ERROR in xxx.jsx |
1 | Error in xxx.scss ... |
还好报错日志很详细,能够看到流水线使用的node版本:node-v10.15.2
。联系CICD开发人员,找到更新流水线node版本入口,更新node版本(平台提供的node版本最高为14)。
报错排查阶段2 - 奇怪的Module Not Found问题
在更新完node版本后,重跑流水线,npm build的Module not found问题依然存在,但这次给出了更详细的报错说明:
1 | ERROR in xxx.jsx |
在这个项目中,组件通过[组件名]/index.jsx
的方式去组织,并且在Webpack
配置了resolve
,这里报错显示routes
路由文件中引入的一个组件未找到(其他组件都正常)。多次检查改组件的名称和路径,并没有发现问题。此时,尝试去掉组件名的目录,使用[组件名].jsx
的方式去创建组件,然后重新触发流水线,流水线无报错!所以,到底是哪里出现了问题!?
罪魁祸首 - Git Config的ignoreCase
虽然已经解决了这个奇怪的问题,但仍未找到根本原因,于是继续去定位问题。
为什么其他组件的引入没有问题,就单独这个组件报错?事出蹊跷,必有猫腻🐱!
回想起曾经看到组件的命名方式不是caselCase
,当时顺手改了一下目录的名称。灵光一闪,如果仓库的git config的ignoreCase为true的情况,git会忽略大小写的变更!查看了.git
下的config
文件,果不其然:
1 | ... |
再去查看远程仓库上的代码,文件名果然还是全小写的命名,而非修改过后的camelCase
方式。
最后
查看Git的官方文档,ignoreCase
这个参数默认为false
,虽然不知内部的仓库为什么设定了true
属性,但觉得这次的排查可供遇到相同问题的朋友提供借鉴意义~
(为了预防自己遇到这样的问题,快把ignoreCase设置为false吧)