Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 代码发布 › 「技术教程」定制项目包管理器 | 使用生命周期脚本限制只允许特定包管理器

「技术教程」定制项目包管理器 | 使用生命周期脚本限制只允许特定包管理器

Eswlnk的头像
Eswlnk
2023-12-20 23:17:43
「技术教程」定制项目包管理器 | 使用生命周期脚本限制只允许特定包管理器-Eswlnk Blog
智能摘要 AI
该文章介绍了如何通过配置强制项目仅使用特定的包管理器(如pnpm)。具体实现是在`package.json`中设置`preinstall`脚本为`npx only-allow pnpm`,利用`only-allow`和`which-pm-runs`插件检测并限制包管理器。若用户未按要求使用指定包管理器,则会终止进程并显示警告。此外,文中提到pnpm安装时会生成`node_modules`和`pnpm-lock.yaml`文件,这可能导致冲突。为此,有开发者开发了`npm-only-allow`插件,不仅检测还清理生成的文件,确保兼容性。

前言

最近我发现了一个非常有趣的配置,可以强制项目只能使用特定的包管理器,阻止其他人随意选择。这个配置实际上在pnpm的官方文档中已经有了,只是一直以来我都没有注意到。

具体的配置来源可以在这里找到:Only allow pnpm。

接下来,我们将开始介绍如何实施这个配置。

「技术教程」定制项目包管理器 | 使用生命周期脚本限制只允许特定包管理器-Eswlnk Blog

教程

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

生命周期文档:npm-install

「技术教程」定制项目包管理器 | 使用生命周期脚本限制只允许特定包管理器-Eswlnk Blog

有哪些生命周期?

当执行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_modules和pnpm-lock.yaml文件,安装完后就会报错提示,感觉有点来不及了。

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

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

本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
声明:本站原创文章文字版权归本站所有,转载务必注明作者和出处;本站转载文章仅仅代表原作者观点,不代表本站立场,图文版权归原作者所有。如有侵权,请联系我们删除。
包管理器工程实践项目项目部署
1
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
「技术教程」CSS技巧打造SPA首屏骨架屏 | 实现快速加载和用户友好的首屏骨架结构
上一篇
「技术教程」vite+vue3 代替require()的hooks
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「日志记录」逆向必应翻译网页版API实现免费调用
  • 「代码分享」第三方平台VIP视频解析API接口
  • 「至臻原创」某系统网站登录功能监测
  • 「开发日志」在Vue3中如何为路由Query参数标注类型
  • 「其他分享」分享一个在Tun模式下可用的脚本
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

WordPress开发日志:利用Ajax添加文章页自动推送并显示推送结果
2021-11-25 23:59:28
「日志记录」Debian12网络流量监控与自动关机脚本
2024-04-29 13:56:37
「代码发布」又拍云&老薛主机(CPanel)流量监控
2022-08-13 9:02:10

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.713 秒   |  SQL查询 38 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈