pnpm改造替换npm

news2024/11/24 18:43:41

Q: 为什么要迁移pnpm?

相比于npm,pnpm有一些优势:

  1. 更快的安装速度: 在安装包时,pnpm使用了硬链接的方式,将已安装的包链接到新的目录下,而不是复制或下载包。这样,当你安装一个包的不同版本或者不同项目使用同一个包时,它们会共享已经安装的包,减少了磁盘空间的占用,同时也加速了安装的速度。

  2. 更少的磁盘空间占用: 由于pnpm使用硬链接的方式共享已安装的包,因此相比于npm,pnpm占用更少的磁盘空间。

  3. 更好的本地缓存: pnpm会缓存包的元数据和二进制文件到本地缓存中,这样再次安装相同的包时,会从本地缓存中读取,而不是重新下载。这样可以提高安装包的速度,并减少网络带宽的消耗。

  4. 更好的多项目管理: pnpm可以管理多个项目的依赖,可以将相同的依赖安装在一个公共的位置,减少磁盘空间的占用,并且可以快速地切换项目之间的依赖关系。

  5. 更好的可重复性: pnpm使用了锁文件来保证安装包的版本一致性,同时也支持自定义的锁文件名称和路径。这样可以确保项目在不同的环境中的安装结果一致,增强了可重复性。

需要注意的是,pnpm相比于npm也存在一些缺点,例如兼容性问题、社区支持不如npm等。因此,在选择使用pnpm还是npm时,需要根据自己的实际需求和项目情况进行权衡。

Q: 上面提到的硬链接和符号链接是什么?

硬链接和符号链接都是文件系统中的链接方式,它们的作用是可以将一个文件或目录链接到另一个文件或目录上,从而实现共享或复制等功能。下面我来简单介绍一下它们的区别和示例。

硬链接

硬链接是指在文件系统中,将一个文件名链接到另一个文件上,使它们指向同一个物理数据块,也就是说,这两个文件名共享同一个inode节点。硬链接的本质是将一个文件名指向一个已存在的文件。

硬链接的特点:

  • 硬链接不能跨越不同的文件系统,因为inode节点只存在于一个文件系统中。
  • 硬链接可以看作是原文件的一个副本,它们的文件权限、拥有者、修改时间等都是相同的。
  • 删除硬链接并不会删除原文件,只有当所有的硬链接都被删除后,原文件才会被真正删除。

下面是一个硬链接的示例:

$ touch file1 # 创建一个文件
$ ln file1 file2 # 创建硬链接
$ ls -li file* # 查看文件inode节点
12345 -rw-r--r-- 2 user user 0 Apr 26 10:00 file1
12345 -rw-r--r-- 2 user user 0 Apr 26 10:00 file2

可以看到,file1和file2的inode节点是相同的,说明它们共享同一个物理数据块。

符号链接

也称之为软链接,符号链接是指在文件系统中,创建一个特殊的文件,其中包含了另一个文件的路径,通过这个特殊文件来链接到目标文件。符号链接的本质是将一个文件名指向一个路径。

符号链接的特点:

  • 符号链接可以跨越不同的文件系统,因为它们只是一个指向文件或目录的路径。
  • 符号链接指向的是目标文件或目录的路径,而不是inode节点,因此,目标文件或目录的属性信息可以独立于符号链接存在。
  • 删除符号链接不会影响目标文件或目录,也不会删除它们。

下面是一个符号链接的示例:

$ touch file1 # 创建一个文件
$ ln -s file1 file2 # 创建符号链接
$ ls -li file* # 查看文件inode节点
12345 -rw-r--r-- 1 user user 0 Apr 26 10:00 file1
67890 lrwxr-xr-x 1 user user 5 Apr 26 10:01 file2 -> file1

可以看到,file2是一个符号链接文件,它的inode节点和file1不同,而是一个指向file1的路径。

Q: 看到一些文章里说pnpm走的是硬链接,有的说用了软连接。到底走的是什么?

其实,pnpm是软连接和硬链接都用了。可以这么理解,pnpm在机器上某个地方存放安装好的所有依赖包,这些依赖包是独立于我们代码仓库的,这也是前面说的pnpm在安装速度和磁盘空间占用上的优点。而我们的代码库确实是先通过硬链接的方式来建立代码库和已安装过的依赖包之间的共享关系。可以打开代码库看到node_modules下有一个.pnpm文件夹,里面放的就是当前代码库建立的硬链接。

image.png

.pnpm下的文件都是一些名字很长的,长这样:

image.png

这里不用关心具体是什么,我们需要关心的是node_mpdules下我们认识的npm依赖包,它们正是通过软连接的方式来链接到.pnpm下的这些依赖包的。在vscode下,可以明显看到npm包后面的软连接标识:

image.png

如果想看一下这些软连接到底指向哪里的,可以:

# 进入node_modules目录
cd node_modules

# 枚举文件列表
ll

image.png
可以看到,这就是node_modules下软链接到.pnpm下的。

Q: 这个模式跟npm dedupe是不是很相似,有什么不同?

pnpm的硬链接模式和npm的dedupe功能是类似的,都是通过共享已安装的包来减少磁盘空间的占用,同时也可以提高安装包的速度。但它们之间还是存在一些不同:

  1. 原理不同: pnpm使用硬链接的方式共享已安装的包,而npm使用的是符号链接的方式共享已安装的包。硬链接是文件系统的一种特殊链接,它可以将一个文件链接到另一个文件上,使它们共享相同的内容。符号链接则是一个指向另一个文件或目录的特殊文件。

  2. 适用范围不同: pnpm的硬链接模式可以在多个项目之间共享已安装的包,而npm的dedupe功能只能在单个项目内共享已安装的包。

  3. 优势不同: pnpm的硬链接模式可以减少磁盘空间的占用和提高安装包的速度,而npm的dedupe功能只能减少磁盘空间的占用。

  4. 实现方式不同: pnpm使用了自己的包管理器和包存储库,而npm使用了公共的包管理器和包存储库。这也是导致它们之间存在差异的一个重要原因。

需要注意的是,无论是使用pnpm的硬链接模式还是npm的dedupe功能,都需要谨慎使用,以避免出现意外的错误。特别是在使用硬链接模式时,如果多个项目共享同一个包,需要注意不要在一个项目中修改了该包的文件,导致其他项目也受到影响。

Q: pnpm对于node版本有要求吗?

pnpm有对node版本的要求。官方文档中列出的最低支持版本是Node.js 10.x,推荐使用的版本是Node.js 14.x。如果使用的是较旧的Node.js版本,可能会导致安装和使用pnpm时出现错误。

我这里本来用的是Node14.x。因为其他原因,本次也给Node升级到16.x了。

Q: pnpm有类似npm ci的命令吗?

补充:npm ci主要是用于刚刚在download了一个仓库后,还没有node_modules的时候让npm完全根据package.json和package-lock.json的规范来install依赖包。相比较于直接走npm inpm ci会带来更精确的小版本版本号控制,因为npm i对于一些"^1.0.2"这样的版本号,可能会按照1.x.x这样的规范给你无感升级了,造成和之前某些包版本号之间的差异。
但是当本地已有node_modules的时候,就没办法用npm ci命令了。

是的,pnpm也有类似 npm ci 命令的功能,可以使用 pnpm install --frozen-lockfile 命令实现。它会根据 package-lock.jsonpnpm-lock.yaml 确定依赖关系,并且在安装期间不会更新任何包。此命令类似于 npm ciyarn install --frozen-lockfile 命令。

Q: pnpm@7搭配husky@8后commit一直失败怎么办?

这是因为hooks出问题了。某些代码库里会在commit时候会添加一些hook用来处理commit相关的事务,比如生成commit-id之类的。

husky@8后需要处理一下这个:

husky add .husky/commit-msg 'sh .git/hooks/commit-msg "$@"'

手动把之前.git/hooks下的脚本拷贝到.husky下。

友情提示:.git和.husky一般都是在项目根目录下的隐藏文件夹喲~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM - DataCollatorForLanguageModeling 样本生成 by transformers

目录 一.引言 二.生成样本 By API 1.样本处理样式 2.DataCollatorForLanguageModeling 2.1 样本准备 2.2 API 生成 三.生成样本 By DIY 1.样本准备 2.data_colloator 实现 3.使用自定义 data_colloator 四.总结 一.引言 前面我们讲了 Baichuan7B 的 lora 微调步骤&a…

2023年7月广州/惠州/深圳软考信息系统项目管理师报名

信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资…

矩阵的范数和特征值之间的关系

参考: linear algebra - Why is the norm of a matrix larger than its eigenvalue? - Mathematics Stack Exchange

SpringBoot 对象存储 MinIO

SpringBoot 对象存储 MinIO 1.MinIO简介 MinIO 是一个基于 Go 实现的高性能、兼容 S3 协议的对象存储。它采用 GNU AGPL v3 开源协议,项目地址是 https://github.com/minio/minio,官网是 https://min.io。 它适合存储海量的非结构化的数据&#xff0c…

园区能源控制管理系统

园区能源控制管理系统是一种能够实现对园区内能源消耗、供应和分配进行实时监控、管理和控制的系统。该系统通过对园区内各种能源设备的数据采集、处理和分析,为管理者提供实时的能源使用情况和数据分析,从而帮助管理者制定科学的能源管理策略和节能措施…

《向量数据库指南》——传统数据库上的向量搜索插件

传统数据库上的向量搜索插件 很好,现在我们已经知道了向量搜索库和向量数据库之间的区别,下面让我们来看看向量数据库与向量搜索插件有何不同。 很多传统关系型数据库和搜索系统,如 ClickHouse 和 Elasticsearch,都包含内置的向量搜索插件。例如,Elasticsearch 8.0 包…

疫情数据微处理——Numpy实战

注:文章内容参考了莫烦python 一、数据来源 数据来自于Kaggle公开免费数据集,需要的伙伴可以自行到这里下载。 二、展示数据 我们用一个字典存储csv数据的第一行、每一行开头的日期以及除了这两者外的数据。 import csv import numpy as npwith ope…

2023年7月13日,Stream流,Stream流的获取,Stream流中间聚合操作,Stream流终结操作,Calendar时间日期类,包装类

Stream流 1. 单列集合的Stream流获取 Java中的Stream流操作可以分为中间操作和终止操作两种。 中间操作包括: filter:对流中的元素进行筛选。map:对流中的元素进行转换。flatMap:对流中的元素进行扁平化映射。distinct&#x…

重启Oracle数据库

root 用户登录服务器。 1、 以oracle身份登录数据库,命令:su - oracle 2、 进入Sqlplus控制台,命令:sqlplus /nolog 3、 以系统管理员登录,命令:connect / as sysdba可以合并为:sqlplus sys/密码…

Acwing:第 111 场周赛(2023.7.12 C++)

目录 5047. 1序列 题目描述: 实现代码: 5048. 无线网络 题目描述: 实现代码: 二分 贪心 5049. 选人 题目描述: 实现代码: 数学 5047. 1序列 题目描述: 实现代码: #incl…

如何实现浏览器内多个标签页之间的通信?

1、使用 LocalStorage 特点:同域共享存储空间;持久化将数据存储在浏览器;提供事件监听storage变化 实现逻辑: A页面将数据存储在本地。B页面监听storage的变化,同步storage的最新数据; 好处:操…

绘制数据图

读取文件: ( 1960 : 30 64 6 ) (1970 : 24 69 7 ) (1980 : 23 68 9 ) (1990 : 18 70 12) (2000 : 15 68 17 ) (2010 : 13 64 23 ) (2020 : 12 60 28) ( 2030 : 11 59 30 ) ( 2040 : 11 56 33 ) 运行代码: //绘制数据图 #include"std_lib_facil…

2.字体图标

2.1字体图标的产生 字体图标使用场景:主要用于显示网页中通用、常用的一些小图标。 精灵图是有诸多优点的,但是缺点很明显: 1.图片文件比较大 2.图片本身放大和缩小会失真 3.一旦图片制作完毕想要更换非常复杂 字体图标iconfont可以很好的解决以上问题…

Redis特性初识及其安装与配置

目录 1.认识Redis Redis主要特点 主要应用场景 2.MySQL VS NoSQL 3.Redis的安装与配置 redis5的安装 修改配置文件 启动redis 4.Redis客户端 命令行客户端 图形化界面客户端 基于redis的API自行开发客户端 1.认识Redis Redis(Remote Dictionary Serve…

Python-Web框架flask使用

目录 1.Web框架 1.1 flask 1.1.1 debug调试 1.1.2 定义参数web服务 获取字符串 ​编辑 1.1.3 html网页渲染 1.13.1 带参数传给网页文件 普通元素 列表元素 字典元素 1.Web框架 1.1 flask python的web框架,目录结构如下: 1.static存放的是css,…

《Linux运维总结:Centos7.6之OpenSSH7.4升级版本至9.3》

一、环境信息 操作系统:Centos7.6.1810 OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 如下图所示: 注意:升级后由于加密算法的区别,低版本的SSH工具可能无法连接,建议改用Xshell7或SecureCRT9.0以上版本。 二、注意事项 1、 …

2023最新版 Navicat 16.2.3安装和试用教程详解:轻松掌握最新版本的数据库管理工具连接Redis

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

kettle开发-Day40-AI分流之case/switch

前言: 前面我们讲到了很多关于数据流的AI方面的介绍,包括自定义组件和算力提升这块的,今天我们来学习一个关于kettle数据分流处理非常重要的组件Switch / Case 。当我们的数据来源于类似日志、csv文件等半结构化数据时,我们需要在…

计算机网络 day6

目录 arp协议 arp病毒\欺骗 arp病毒的运行原理 arp病毒产生的后果: 解决方法: ICMP协议 ICMP用在哪里? ICMP协议数据的封装过程 ​编辑 为什么icmp协议封装好数据后,还要加一个ip包头,再使用ip协议再次进…

【UE4 C++】08-生成抛射物来模拟攻击效果

步骤 新建一个C类,父类为Actor,命名为“ASMagicProjectile” 在“ASMagicProjectile.h”中添加如下代码: 在“ASMagicProjectile.cpp”中添加如下代码: 编译后在虚幻编辑器中新建一个蓝图,选择父类为我们刚创建的C类…