npm-only-allow验证(only-allow的最佳替代
背景
基于项目统一管理规范,需要对包管理器进行统一,目前市面上比较流行的是only-allow库,但是经过测试,发现对multirepo的支持度不友好,见下文
only-allow的不足
安装缺陷
一次性安装
添加preinstall钩子并设置指定的包管理器
pnpm i
使用pnpm i安装,发现only-allow包能正确给出提示,但是node_modules被正常安装
删除node_modules后,执行cnpm i,表现和pnpm一致
单独安装
执行pnpm|cnpm i lodash ,发现连拦截提示都没有
其他
在使用了错误的包管理器安装后,当出现错误后,项目会生成npminstall-debug.log文件,当再次切换到“合法的”包管理器安装后,该文件仍然存在
如果先后使用了pnpm,npm,则生产的lock文件会被保留
结论
由于以上三个不足,我决定弃用only-allow,通过查找翻阅,发现类似功能的库,但是由于其知名度不如only-allow,因此需要对其进行校验,以确保达到如下要求
支持拦截“非法”包管理器,并不安装node_modules
当从“非法”转为设置的包管理器后,需要删除无用的文件,比如:上次安装时的错误文件,或遗留的lock文件
使用与验证
安装npm-only-allow文档添加如下代码
统一安装
pnpm i
它可以正确给出提示(而且是中文的,更加友好),且不会生产node_modules
可以看到,安装错误后生成了.pnpm-debug.log文件,现在使用yarn安装,测试是否能正常安装,以及是否还存在该错误文件,发现符合预期
单个安装
执行pnpm i lodash,我发现是没有被拦截掉的,翻了下文档后发现,是需要在项目执行时才会针对单独安装进行检测的,则执行npm run start,发现会被正确拦截,并且列出了哪个依赖被错误安装了
此时,再使用正确的包管理器yarn安装(yarn add lodash)后,再重启测试,发现程序运行正常
结论
通过在我自己的搭建的简易项目中测试(实际上测试了很多情况),该包基本上能满足预期效果,但是有一点目前尚不支持,那就是,如果我的项目目前已经启动过了,那它就只能等待下一次运行时才能给出检测结果,这一点可能是作者本身没有考虑到吧,不过应该也不难实现,待我去提个issue(2023-4-3更新:issue已解决)