pnpm v8版本升级变化关注点(前瞻速攻版)
前言
pnpm v8.0.0-alpha.0 版本已经发布,包含少量变化,但其中还是有令人在意的点的。
本文将默认读者拥有大部分 pnpm v7 版本的知识储备,进行 v8 版本的前瞻速攻。
安装方法
目前通过指定 Tag 方式可以安装 v8 alpha 版:
npm i -g pnpm@next-8
所有 Tag 详见:npm > pnpm version
由于距 pnpm v8 正式发布还有一段距离( alpha
> beta
> latest
),本文可能存在部分内容过时,请仔细甄别。
从 v6 升级至 v7
本文是 v7 升级 v8 ,若你需从 v6 升级,可先参考 :
- 聊聊 pnpm v6 升 v7 拥抱的变化和经验谈
正文
下面对 changelog 逐条分析。
auto-install-peers
is true
by default
在 pnpm v7 版本之初,strict-peer-dependencies
是默认打开的,这会导致不安装 peerDependencies
就会安装报错(除非打开 auto-install-peers
),引发了大量社区反馈,极大降低了 pnpm 的易用性,我们在 v6 升级 v7 的文章中也推荐设定 strict-peer-dependencies=false
避免不必要的报错问题。
所以 strict-peer-dependencies
在 v7.13.5
又调整回默认 false
。
v7 的计划失败了,到了 v8 ,可以看出 pnpm 希望通过默认打开 auto-install-peers=true
的方式解决 peerDependencies
的问题,但这会导致在本地 package.json
中的 peerDependencies
也被安装,一个例子如下:
// package.json
{"peerDependencies": {"react": "^18"}
}
此时我们不期望 react
被安装,因为我们没有在 dependencies
/ devDependencies
指明安装他,但由于 auto-install-peers
被默认打开,最终仍然会安装 react
。
进一步,在实际业务中,分情况考虑可能造成的影响:
-
普通场景:在本地开发时,按照开发规范,我们必然对
peerDependencies
的依赖也在devDependencies
指定一份,但不在dependencies
指定,所以该依赖是肯定会被安装的,auto-install-peers
不会对我们造成影响。 -
monorepo 场景:在 monorepo 时我们有 Monorepo丝滑方法论 ,依赖总唯一,所以无需担心
auto-install-peers
问题。
通过分析我们得知 auto-install-peers=true
默认打开一般情况对我们没有实质性影响。
下面我们举两个会存在问题的 case 供参考:
-
npm link
调试等情况,导致peerDependencies
被意外安装,但npm link
早已过时不再使用,这种情况是很少见的。 -
不遵守 npm 包开发规范,导致
peerDependencies
被意外安装,我们也不展开该极少数的情况。
由于 auto-install-peers
几乎不会对我们造成影响,加上使用包管理工具应该向 零配置 靠拢,本文不再推荐手动关闭 auto-install-peers
该选项,而是拥抱变化,若有极少数的特殊需求,你可能需要关闭该行为:
// .npmrc
auto-install-peers=false
The registry field is removed from the resolution object in pnpm-lock.yaml
lock 文件层面格式的优化,对我们使用没有直接影响,可以忽略。
save-workspace-protocol
is rolling
by default
save-workspace-protocol
决定了在 pnpm monorepo 中,手动安装工作区内同名包的版本添加行为:
pnpm add foo
如我们的 workspace 含有 foo
该包,在 v7 我们安装该包得到的是:
"foo": "workspace:^1.0.0"
现在 v8 默认 rolling
策略得到的将是:
"foo": "workspace:^"
由于我们极少在工作区内手动运行安装同名包的命令,往往是手动添加 workspace 内的其他包,并且使用 *
格式:
// package.json// 手动添加要使用的 monorepo 内其他包"foo": "workspace:*"
所以此变化不会影响我们的使用,可以忽略。
When there’s a files
field in the package.json
, only deploy those files that are listed in it
该命令涉及到 pnpm deploy 相关,由于 prune
功能还不够成熟,考虑到没有得到 nextjs 示例项目的推荐,我们几乎不会使用,可以忽略。
Use lockfile v6
by default
v6
是 pnpm 的下一个大版本的 lockfile 格式,目前格式版本是 5.4
:
// pnpm-lock.yaml
lockfileVersion: 5.4// ...
// pnpm-lock.yaml (pnpm v8)
lockfileVersion: '6.0'// ...
6.0
lockfile 格式相比 5.4
有 80% 内容基本一致,变化主要集中在对依赖的 版本描述 上,以下给出一个大致的 demo :
// old 5.4/@ant-design/colors/6.0.0:resolution: { ... }dependencies:'@ctrl/tinycolor': 3.4.0
// new 6.0registry.npmjs.org/react@18.0.0:resolution: { ... }name: reactversion: 18.0.0engines: {node: '>=0.10.0'}dependencies:loose-envify: ...dev: true
可以看出 6.0
新版 lockfile 对依赖的描述从 单行 变成了 多行 ,但对我们实际使用没有影响,运行 pnpm i
刷新 lock 文件即可,该变化可以忽略。
注:pnpm 早在 v7.24.2
就预先放出了该 6.0
lockfile 版本的配置项,同时官方仓库也第一时间使用了 6.0
新版 lockfile 格式,没有 Breaking change ,可以放心使用。
resolve-peers-from-workspace-root
is true
by default
resolve-peers-from-workspace-root
该选项主要用来解决 monorepo peerDependencies 困境 问题,当多子包需要同一个 peerDependencies
时,无需手动配置提升,而是在 root 安装唯一的该依赖,即可保证全局唯一性。
但提升至 root 只适合要求的版本范围全部匹配,可以唯一提升的依赖,不支持精细版本控制,同时会污染 monorepo 根 root ,造成不必要的隐形全局依赖和心智负担,我们在 Monorepo管理方法论和依赖安全 中明确指出 严禁安装 monorepo 全局依赖 ,故此选项不推荐使用,同时我们有 Monorepo丝滑方法论 实现更好的 monorepo 多实例解法,轮不到 resolve-peers-from-workspace-root
发挥作用,可以忽略该变化。
需要注意的是, Monorepo丝滑方法论 往往和框架挂钩,对于小型 monorepo 项目,若支持不了 丝滑方法论 的实现,可以勉强接受
resolve-peers-from-workspace-root
这种解决peerDependencies
困境的方法。
publishConfig.linkDirectory
is true
by default
随着 package.json#exports
的流行,更多的项目会采用非根发布 npm 包(如 jotai 等),publishConfig.linkDirectory
是对于此类项目的优化支持,不会直接影响到我们的使用,可以忽略。
resolution-mode
is lowest-direct
by default
近年 npm 供应链攻击的 case 偶然发生,目前比较好的 被动 管控手法有:
-
预打包依赖:参考 Nextjs / Umi 预打包策略,实现略。
-
pnpm
time-based
:time-based 策略可以基于包的最后发布时间来确保你使用的依赖在某个发布时间前,从而规避供应链发新包导致的攻击问题,但对于非自建 npm registry 需要花费更多时间读取 npm 包元信息,目前 pnpm 官方采用此策略,此处不做展开。 -
pnpm
lowest-direct
:lowest-direct 是另一种 pnpm 推出的 缓解 供应链攻击的手段,他等价于锁定你的直接依赖版本(解析为 semver 的最低依赖版本),比如^1.0.0
也只会安装1.0.0
最低版本,而不是最新的^1
版本,这等价于你锁定该依赖到1.0.0
,若你需要1.2.0
版本也需要写为^1.2.0
或1.2.0
,该行为可以从一定程度上 缓解 供应链发新包导致的攻击,也不会承受time-based
策略拉取 npm 元信息造成的依赖安装变慢。
默认 lowest-direct
策略后,我们可以直接性的 缓解 供应链攻击造成的影响,即使在没有 lock 文件时也可以每次都安装到确定的依赖版本。
但相应的成本是:必须显示的提升依赖版本号来做依赖升级,否则无法安装到最新版本,使用解析到的最低版本极有可能遭受未知的 bug ,从而浪费大量排查时间,请在使用 pnpm v8 时格外注意手动升级依赖至最新版本防止未知的 bug 。
Direct dependencies are deduped. So if the same dependency is both in a project and in the workspace root, then it is only linked to the workspace root
该变动是为了配合 resolve-peers-from-workspace-root
的行为,忽略即可。
Create a lockfile even if the project has no dependencies at all
对我们没有直接影响,忽略。
总结
通过分析 pnpm v8 alpha 的变化我们发现,只要遵守 pnpm v7 我们总结出来的 monorepo 方法论:
-
Monorepo 丝滑方法论:引用模块热更新
-
Monorepo 管理方法论和依赖安全
从 v7 升级至 v8 是几乎无损、水到渠成顺利的。
另外,请留意在 v8 状态下你的依赖是 锁定等价 的最低版本,请定期升级版本防止不必要的 bug ,并在出现 bug 时升级依赖排查。
若你需要进一步了解 monorepo ,提供如下内容参考:
-
monorepo 工作流基础之 changesets 打开与进阶(Speeches)
-
pnpm monorepo 的技术选型临界点(Critical adoption)
-
Monorepo 设计思路(Speeches)
-
turborepo v1.2.0版本升级指南
以上。
相关文章:
pnpm v8版本升级变化关注点(前瞻速攻版)
前言 pnpm v8.0.0-alpha.0 版本已经发布,包含少量变化,但其中还是有令人在意的点的。 本文将默认读者拥有大部分 pnpm v7 版本的知识储备,进行 v8 版本的前瞻速攻。 安装方法 目前通过指定 Tag 方式可以安装 v8 alpha 版: npm…...

Python基础-环境安装
Python安装1.下载PythonPython网址:https://www.python.org/进入Python官网,点击Downloads,选择自己对应的操作系统(此处以Windows为例)在左侧的稳定发行版中,选择一个3.5版本以上的,然后点击对…...
重载、重写、重构概念辨析
首先,重载、重写、重构都表现为方法名相同 重载 重载(overload),表示同一类的方法之间的关系,至少有以下其中一种情况 参数个数不同参数类型不同参数顺序不同 注意,返回值类型不同不能作为重载依据 重…...

第九章 - 多表查询(join,left join 等)与合并查询(union union all)
第九章 - 多表查询(join,left join 等)与合并查询(union)交叉链接(笛卡尔积)内连接查询外连接查询左链接: left join右链接:right join组合查询 union & union all使…...

matplotlib学习笔记(持续更新中…)
目录 1. 安装,导入 2. figure,axes(图形,坐标图形) 2.1 figure对象 2.2 axes对象 2.3 代码演示 2.3 subplot() 方法 3. 图表的导出 3.1 savefig() 方法 3.2 代码演示 1. 安装,导入 pip install m…...

STM32 SystemInit()函数学习总结
拿到程序后如何看系统时钟?User文件夹——system_stm32f4xx程序,先找systemcoreclock(系统时钟)但是这里这么多个系统时钟应该如何选择?点击魔法棒,然后点击C/C可以看到define的是F40_41XXX.USE这一款 ,对应着就找出了…...

【Spring Boot 原理分析】- 自动配置
【Spring Boot 原理分析】- 自动配置 Condition 注解 Condition 是 Spring 4.0 增加的条件判断功能,通过这个功能可以实现选择的创建 Bean 操作 👑 我们在使用 Spring 的时候,只需导入某个依赖的坐标,就可以直接通过 Autwired 注…...
简明易懂的JVM理解
文章目录简明易懂的JVM和GC理解写在前面Java虚拟机(JVM)的组成基本介绍结构类加载子系统(ClassLoader SubSystem)介绍类加载过程类加载过程小结双亲委派模型(Parent-Delegation Model)简介优点Java9的类加载的委派关系变动双亲委派模型小结运行时数据区(Runtime Data Areas)介绍…...

新考纲下的PMP考试有多难?
PMP考试在6月25号考试结束后,在网上引起一片哗然,新考纲领域与考点的转变使得考试难度加大:PMP考试敏捷和混合内容比重大,考试难度加大很多;考题更加注重考生的知识应用能力,领域更宽; 接下来我…...
朗润国际期货:知名投行/大佬打Call记
知名投行/大佬打Call记 2023年知名投行/大佬看好哪些投资标的 中国股市 高盛(2023年1月):将上涨15% 花旗(2023年1月):上半年会成为投资两点 摩根大通(2022年11月):M…...

遗传算法及Python实现
0 建议学时 4学时 1 人工智能概述 2020中国人工智能产业年会在苏州召开,会上发布的《中国人工智能发展报告2020》显示,过去十年(2011-2020) ,中国人工智能专利申请量达389571件,占全球总量的74.7%,位居世界第一。 报…...

零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]
原创首发于CSDN,转载请注明出处,谢谢! 文章目录为何会在Linux下开发单片机个人系统环境与所用开发板安装开源编译器 sdccSTC MCU ISP 闪存工具 stcgal 的安装单片机代码的编译与测试|编写主代码 main.c|使用 sdcc 编译…...

手摸手快速入门 正则表达式 (Vue源码中的使用)
vue2源码 在 vue2 源码的 src\compiler\parser\html-parser.js 文件中 里面有大量的正则表达式,如下图 可以看到非常的长,不是我说,就前几行,如果没有相关的 正则表达式 的工具,我可能就被劝退了😭 这里…...

TCP/IP网络协议族分成及其每层作用
1、可以分为应用层、传输层、网络层、链路层 2、各层的作用 应用层(可以想象成是快递打包过程) 决定了向用户提供应用服务时通信的活动,将要进行的操作或者数据进行一个打包。 传输层(可以理解为选择顺丰、圆通等快递公司) 提供数据传输的方…...
041、子序列类型问题(labuladong)
子序列类型问题 一、经典动态规划:编辑距离 基于labuladong的算法网站,经典动态规划:编辑距离; 总结: 一般来说涉及到两个字符串的问题,需要依赖上一次的各种操作,一般使用dp tableÿ…...

linux系统开机文段释义
第一段Version 2.01.1204. Copyright (C) 2010American Megatrends, Inc.Press <DEL> or <F2> to entersetup. Press <F7> for BBS POPUP Menu.设备上电,提示按DEL键或者F2键进入BIOS设置。按F8可以调出启动设备列表,可以选择性的启动…...

抽奖动画大转盘抽奖思路与做法
抽奖是各类营销活动中最常见的一种形式,本产品需求大致如下:转盘周围跑马灯交替闪烁,点击抽奖,大转盘旋转,调用接口获取抽奖结果,大转盘指针指向对应的奖品。高保如下图12.整体思路本需求要求跑马灯交替闪烁…...
Java实现 - 华为2016研发工程师编程题
文章目录删数字符集合数独删数 题目描述 有一个数组 a[N] 顺序存放 0 ~ N-1 ,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以 8 个数 (N7) 为例 :{ 0,1,2…...
nginx的七层负载均衡
文章目录一、负载均衡介绍二、nginx的配置文件三、实验过程总结一、负载均衡介绍 四层负载均衡 所谓四层负载均衡是指OSI七层模型中的传输层, 那么传输层Nginx已经支持TCP/IP的控制, 所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载, 那么他的好处是性能非常快,…...

信息加密技术
介绍信息加密 信息加密是实现数据保密性的手段。 信息加密(Encryption)是将明文信息转换为密文信息,使之在缺少特殊信息时不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。 现…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...