npm-only-allow验证(only-allow的最佳替代

2023-01-16  本文已影响0人  习惯水文的前端苏

\bullet 背景

    基于项目统一管理规范,需要对包管理器进行统一,目前市面上比较流行的是only-allow库,但是经过测试,发现对multirepo的支持度不友好,见下文

\bullet only-allow的不足

    \alpha 安装缺陷

        \ast 一次性安装

            \vdash 添加preinstall钩子并设置指定的包管理器

            \vdash pnpm i

                使用pnpm i安装,发现only-allow包能正确给出提示,但是node_modules被正常安装

            \vdash 删除node_modules后,执行cnpm i,表现和pnpm一致

        \ast 单独安装

            执行pnpm|cnpm i lodash ,发现连拦截提示都没有 

    \beta 其他

        在使用了错误的包管理器安装后,当出现错误后,项目会生成npminstall-debug.log文件,当再次切换到“合法的”包管理器安装后,该文件仍然存在

        如果先后使用了pnpm,npm,则生产的lock文件会被保留

\bullet 结论

    由于以上三个不足,我决定弃用only-allow,通过查找翻阅,发现类似功能的库,但是由于其知名度不如only-allow,因此需要对其进行校验,以确保达到如下要求

    \ast 支持拦截“非法”包管理器,并不安装node_modules

    \ast 当从“非法”转为设置的包管理器后,需要删除无用的文件,比如:上次安装时的错误文件,或遗留的lock文件

\bullet 使用与验证

    安装npm-only-allow文档添加如下代码

    \vdash 统一安装

        \ast pnpm i

            它可以正确给出提示(而且是中文的,更加友好),且不会生产node_modules

            可以看到,安装错误后生成了.pnpm-debug.log文件,现在使用yarn安装,测试是否能正常安装,以及是否还存在该错误文件,发现符合预期

    \vdash 单个安装

        执行pnpm i lodash,我发现是没有被拦截掉的,翻了下文档后发现,是需要在项目执行时才会针对单独安装进行检测的,则执行npm run start,发现会被正确拦截,并且列出了哪个依赖被错误安装了

        此时,再使用正确的包管理器yarn安装(yarn add lodash)后,再重启测试,发现程序运行正常

\bullet 结论

    通过在我自己的搭建的简易项目中测试(实际上测试了很多情况),该包基本上能满足预期效果,但是有一点目前尚不支持,那就是,如果我的项目目前已经启动过了,那它就只能等待下一次运行时才能给出检测结果,这一点可能是作者本身没有考虑到吧,不过应该也不难实现,待我去提个issue(2023-4-3更新:issue已解决)

\bullet npm-only-allow仓库地址

上一篇下一篇

猜你喜欢

热点阅读