包管理工具 pnpm 简介

2023年 9月 16日 88.3k 0

中文网

pnpm - 速度快、节省磁盘空间的软件包管理器。

为什么使用 pnpmpnpm 的特性和优势?

1. 快速高效、节省磁盘空间
  • pnpm 是同类工具速度的将近 2 倍
  • node_modules 中的所有文件均克隆或硬链接自单一存储位置

如果使用 npm 或 yarn,如果 100 个项目同时用到同一个依赖包时,就需要在硬盘上拷贝 100 份。而使用 pnpm 时,所有依赖包都保存在硬盘的统一位置(.pnpm-store),不同项目之间共享依赖包。

  • 如果这些项目使用的同一依赖包是不同的版本,那么只有不同的文件会被再次保存起来。
  • 直接依赖通过符号链接的方式添加在 node_modules 根目录下。实际指向的地址是:.pnpm/@/node_modules/@ 该地址会硬链接到 .pnpm-store
  • 直接依赖中的间接依赖通过软链接到 node_modules/.pnpm目录下,具体应该是 node_modules/.pnpm/@/node_modules/name@,然后硬链接到 .pnpm-store

2. 支持 monorepo

pnpm 跟 npm 和 Yarn 一样,内置了对 单一存储库monorepo 的支持,只需要在项目根目录下创建 pnpm-workspace.yaml 文件,定义 workspace 的根目录。

3. 权限严格、更加安全

使用 pnpm 创建的 node_modules 默认是非扁平结构,可以防止幽灵依赖。

pnpm 的安装过程

pnpm 分三个阶段执行安装:

  • 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。
  • 目录结构计算。 node_modules 目录结构是根据依赖计算出来的。
  • 链接依赖项。 所有以前安装过的依赖项都会直接从仓库中获取并链接到 node_modules。
  • pnpm 常用命令

    pnpm list

    别名 ls。作用:该命令将以树形结构输出所有已安装软件包的版本及其依赖包。

    --global, -g:列出全局安装目录中的软件包,而不是当前项目中的软件包。

    pnpm list --global # 查看全局安装的软件包
    
    pnpm link

    别名 ln。作用:让当前目录下的软件包在系统范围内或其它位置都可访问。

    pnpm link  # 直接连接对应包的目录
    pnpm link --global # 待发布的软件包中执行
    pnpm link --global  # 将待发布的软件包软连接到项目中
    
    断开连接
    pnpm unlink 与 pnpm link --global 对应。
    pnpm link --global  与 pnpm uninstall --global  对应。
    

    迁移到 pnpm

    # 删除依赖包
    rm -rf node_modules
    
    # 在根目录下新建 .npmrc 文件 
    auto-install-peers=true  # 自动安装任何缺少同级依赖关系
    shamefully-hoist=false # [不推荐] 将所有依赖提升至根目录,即一个扁平的目录结构类似 npm 和 yarn
    
    # 从另一个包管理器的 lock 文件生成 pnpm-lock.yaml
    pnpm import
    
    # 加上 --frozen-lockfile 参数:安装依赖时不更新 pnpm-lock.yaml
    pnpm install --frozen-lockfile
    
    # 启动项目,可能需要解决下幽灵依赖带来的问题
    
    # 修改 ci 文件配置
    

    功能对比

    功能对比

    功能 pnpm Yarn npm
    工作空间支持(monorepo) ✔️ ✔️ ✔️
    隔离的 node_modules ✔️ - 默认 ✔️ ✔️
    提升的 node_modules ✔️ ✔️ ✔️ - 默认
    自动安装 peers ✔️ ✔️
    Plug'n'Play ✔️ ✔️ - 默认
    零安装 ✔️
    修补依赖项 ✔️ ✔️
    管理 Node.js 版本 ✔️
    有锁文件 ✔️ - pnpm-lock.yaml ✔️ - yarn.lock ✔️ - package-lock.json
    支持覆盖 ✔️ ✔️ - 通过 resolutions ✔️
    内容可寻址存储 ✔️
    动态包执行 ✔️ - 通过 pnpm dlx ✔️ - 通过 yarn dlx ✔️ - 通过 npx
    Side-effects cache ✔️
    Listing licenses ✔️ - Via pnpm licenses list ✔️ - Via a plugin

    FAQ

    常见问题

    1. .pnpm-store 存储资源的位置在哪?
    • Mac/linux 中默认会设置到 {home dir}>/.pnpm-store/v3
    • Windows 下会设置到当前盘的根目录下,比如 D 盘:D:.pnpm-storev3
    # 执行以下命令查看 store 存储目录的路径
    pnpm store path
    
    2. .pnpm-store 越来越大怎么办?

    可以执行 pnpm store prune,从存储中删除未引用的包。

    未引用的包是系统上的任何项目中都未使用的包。运行 pnpm store prune 是无害的,对您的项目没有副作用。 如果以后的安装需要已经被删除的包,pnpm 将重新下载他们。

    最好的做法是 pnpm store prune 来清理存储,但不要太频繁。 有时,未引用的包会再次被需要。 这可能在切换分支和安装旧的依赖项时发生,在这种情况下,pnpm 需要重新下载所有删除的包,会暂时减慢安装过程。

    请注意,当 存储服务器 正在运行时,这个命令是被禁止的。

    参考:

    《Why should we use pnpm?》

    《平铺的结构不是 node_modules 的唯一实现方式》

    《包管理工具:pnpm》

    《2022年了,你还没用pnpm吗?》

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论