为什么git子模块构建会依赖父项目的node_modules依赖包?
问题解答
是,Git子模块目录下的构建操作默认会依赖父项目安装的node_modules。
这是Node.js内置的模块解析规则决定的:当Node在执行代码、查找依赖包时,会优先从当前执行目录的node_modules文件夹查找,如果找不到对应包,会自动向上遍历父级目录,依次检查每一层父目录的node_modules文件夹,直到找到对应包或者到达文件系统根目录为止。
这种机制就会导致即便子模块已经在自己的目录下安装了全部依赖,只要父项目的node_modules里存在和子模块依赖版本不一致、或者结构冲突的包,就会干扰子模块的构建流程,出现你遇到的隐晦报错。
你目前临时重命名父级node_modules的方案是有效的,本质上就是阻断了Node向上查找父级依赖的路径,强制子模块只使用自己目录下安装的依赖。如果要避免重命名文件夹可能带来的构建中断后文件无法恢复的风险,也可以用更优雅的替代方案:
- 执行子模块构建时添加Node参数
--preserve-symlinks,禁止Node解析时跳转到父级目录的依赖 - 如果使用Yarn作为包管理器,可以在子模块执行安装和构建时添加
--modules-folder ./node_modules参数,强制指定依赖查找路径为子模块自身的node_modules目录 - 若父项目使用了monorepo workspace配置,可以在子模块的
package.json中添加"workspaces": false声明,避免父项目的workspace规则覆盖子模块的依赖解析逻辑
内容的提问来源于stack exchange,提问作者hyperbotauthor
相关产品推荐
相关产品推荐

