前言

最近发现这个很有意思的配置,可以让项目中强制使用指定的包管理器,其他人瞎鸡儿用的话就会报错阻止,这个配置其实在pnpm的官方文档里就有,只是一直都没发现。

这里贴一下出处:Only allow pnpm

下面开始教程。

教程

在开始之前我们需要了解一下,npm在安装包的时候其实是有一些预设的生命周期脚本的,当然这些脚本其实就是package.json中的scripts定义的命令,官方预设了一些名字,当你添加对应的脚本名字和内容的时候,npm会在install的生命周期中去运行对应时机的脚本命令。

生命周期文档:npm-install

示例:

{
    "scripts": {
        "preinstall": "npx only-allow pnpm"
    }
}

有哪些生命周期?

当执行npm install命令时,npm会按照特定的顺序执行一系列生命周期脚本。这些脚本允许开发者在不同的安装阶段执行自定义的操作。下面是对每个生命周期脚本的解释:

  1. preinstall:在安装依赖包之前运行的脚本。可以在此阶段执行一些准备工作或检查操作,例如检查系统环境、安装必要的依赖工具等。
  2. install:在安装依赖包时运行的脚本。这是最常用的生命周期脚本之一。可以在此阶段执行一些特定的安装操作,例如编译源代码、生成静态资源等。
  3. postinstall:在安装依赖包之后运行的脚本。可以在此阶段执行一些后续操作,例如启动服务、执行一些初始化任务等。
  4. prepublish:在将包发布到npm注册表之前运行的脚本。可以在此阶段执行一些构建或准备发布的操作,例如压缩代码、生成文档等。
  5. preprepare:在执行npm prepare命令之前运行的脚本。npm prepare命令用于准备包以供发布或打包。可以在此阶段执行一些额外的准备工作。
  6. prepare:在执行npm prepare命令时运行的脚本。可以在此阶段执行一些特定的准备操作,例如构建、生成打包文件等。
  7. 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,然后得到当前使用的包管理器数据。

然后进行比对,如果当前运行的包管理器和预设值不同,就会输出警告,然后结束进程。

插件地址:

  1. only-allow
  2. which-pm-runs

至此我们整个流程就很清晰明了了。

完整示例

{
    "scripts": {
        "preinstall": "npx only-allow pnpm"
    }
}

pnpm的一些兼容问题

个人测试如果你要求使用npm作为包管理器,但是通过pnpm进行安装,实际上还是会产生node_modulespnpm-lock.yaml文件,安装完后就会报错提示,感觉有点来不及了。

为此有人自己做了一个插件:npm-only-allow

这个插件增加了启动检测,然后还会删除生成的文件,如果你的项目非常严格可是试试这个。

分类: vue 项目实战 标签: yarnnpmpnpm包管理器

评论

暂无评论数据

暂无评论数据

目录