如何解决NPM工作区单仓中Cannot set properties of null (setting 'parent')报错?
Cannot set properties of null (setting 'parent')报错 问题场景
在使用NPM工作区(workspaces)的monorepo中,包含内部包a、b、c、d、e,外部包x依赖内部包c和d。执行npm install x -w packages/e时触发报错:
npm ERR! Cannot set properties of null (setting 'parent') npm ERR! A complete log of this run can be found in: npm ERR! /Users/harshal/.npm/_logs/2022-11-11T17_27_57_008Z-debug-0.log
错误源于arborist依赖解析环节,尝试多个^8.x.x版本NPM未解决。
可行解决方法
检查外部包
x的依赖配置
确认x的package.json中对c、d的依赖版本与monorepo内对应包的版本兼容,且包名无拼写错误。如果x依赖的c/d版本在monorepo中不存在,arborist解析时可能出现空引用错误。清理NPM缓存后重试
执行缓存清理命令:npm cache clean --force清理完成后,删除
packages/e/node_modules和根目录package-lock.json,再重新执行安装操作。换一种安装方式
不在子包单独安装,而是直接在packages/e/package.json的dependencies中手动添加x的依赖声明,然后在monorepo根目录执行:npm install让NPM工作区统一处理依赖关联。
校验内部包的配置完整性
检查c、d的package.json是否存在格式错误,比如缺失name、version必填字段,或者JSON语法错误(如逗号遗漏)。这类问题会导致arborist无法正确识别内部包,引发空指针报错。调整NPM版本
尝试升级到NPM 8的最新稳定版,或降级到已知无此bug的版本(如8.19.2):npm install -g npm@8.19.2部分NPM 8的中间版本存在arborist解析工作区依赖的逻辑bug。
检查工作区配置
确认根目录package.json的workspaces字段正确包含所有内部包路径,比如:{ "workspaces": [ "packages/a", "packages/b", "packages/c", "packages/d", "packages/e" ] }配置缺失会导致NPM无法识别内部包,进而让
x的依赖解析失败。
内容的提问来源于stack exchange,提问作者Harshal Patil

