约束项目中的包管理为指定包管理器
前言
最近发现这个很有意思的配置,可以让项目中强制使用指定的包管理器,其他人瞎鸡儿用的话就会报错阻止,这个配置其实在pnpm的官方文档里就有,只是一直都没发现。
这里贴一下出处:Only allow pnpm
下面开始教程。
教程
在开始之前我们需要了解一下,npm在安装包的时候其实是有一些预设的生命周期脚本的,当然这些脚本其实就是package.json
中的scripts
定义的命令,官方预设了一些名字,当你添加对应的脚本名字和内容的时候,npm会在install的生命周期中去运行对应时机的脚本命令。
生命周期文档:npm-install
示例:
{
"scripts": {
"preinstall": "npx only-allow pnpm"
}
}
有哪些生命周期?
当执行npm install
命令时,npm会按照特定的顺序执行一系列生命周期脚本。这些脚本允许开发者在不同的安装阶段执行自定义的操作。下面是对每个生命周期脚本的解释:
preinstall
:在安装依赖包之前运行的脚本。可以在此阶段执行一些准备工作或检查操作,例如检查系统环境、安装必要的依赖工具等。install
:在安装依赖包时运行的脚本。这是最常用的生命周期脚本之一。可以在此阶段执行一些特定的安装操作,例如编译源代码、生成静态资源等。postinstall
:在安装依赖包之后运行的脚本。可以在此阶段执行一些后续操作,例如启动服务、执行一些初始化任务等。prepublish
:在将包发布到npm注册表之前运行的脚本。可以在此阶段执行一些构建或准备发布的操作,例如压缩代码、生成文档等。preprepare
:在执行npm prepare
命令之前运行的脚本。npm prepare
命令用于准备包以供发布或打包。可以在此阶段执行一些额外的准备工作。prepare
:在执行npm prepare
命令时运行的脚本。可以在此阶段执行一些特定的准备操作,例如构建、生成打包文件等。postprepare
:在执行npm prepare
命令之后运行的脚本。可以在此阶段执行一些后续操作,例如清理临时文件、生成附加的构建产品等。
这些生命周期脚本提供了灵活性,使开发者能够在特定的安装和构建阶段执行自定义的操作。通过使用这些脚本,可以实现一些常见的任务,如构建项目、运行测试、生成文档等。这些脚本的执行顺序是固定的,npm会按照定义的顺序依次运行它们。
可以看到preinstall
是一个在安装之前运行的,用于检查相关的一个生命钩子。
通过插件约束包管理器
从上面的示例代码可以看到它其实通过npx命令运行了插件only-allow
,通过它去检测当前用户运行的命令,然后拆分命令文本,去判断使用的那个包管理器,是否与指定的包管理器相同,相同即可,不相同就展示提示,然后通过运行node的命令:process.exit(1)
终止当前node.js进程。
源码我就不贴出来,可以自行去查看,要点在于两个:
一个是代码const argv = process.argv.slice(2)
,这个用于获取项目指定的包管理,以上面的代码示例为准,process.argv
可以得到以下值:
[
'C:\\Program Files\\nodejs\\node.exe',
'D:\\Code\\xxx\\scritps\\preinstall.js',
'pnpm'
]
得到一个数组,然后第三个值就是我们命令中指定的包管理器,插件会判断是否有设置值,如果没有设置就输出警告然后结束进程。
如果设置了值,就会通过const whichPMRuns = require('which-pm-runs')
,它引入了自己的依赖which-pm-runs
,然后得到当前使用的包管理器数据。
然后进行比对,如果当前运行的包管理器和预设值不同,就会输出警告,然后结束进程。
插件地址:
至此我们整个流程就很清晰明了了。
完整示例
{
"scripts": {
"preinstall": "npx only-allow pnpm"
}
}
pnpm的一些兼容问题
个人测试如果你要求使用npm
作为包管理器,但是通过pnpm进行安装,实际上还是会产生node_modules
和pnpm-lock.yaml
文件,安装完后就会报错提示,感觉有点来不及了。
为此有人自己做了一个插件:npm-only-allow
这个插件增加了启动检测,然后还会删除生成的文件,如果你的项目非常严格可是试试这个。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据