常见问题
如果包存储在全局存储中,为什么我的 node_modules
使用了磁盘空间?
pnpm 创建从全局存储到项目下 node_modules
文件夹的 硬链接。 硬链接指向磁盘上原始文件所在的同一位置。 因此,例如,如果您的项目中 foo
并且它占用 1MB 的空间,那么看起来它在项目的 node_modules
文件夹中占用了与全局存储相同的 1MB 的空间。 但是,该 1MB 是磁盘上两个不同位置的相同空间 。 所以 foo
总共占用 1MB,而不是 2MB。
获取有关此主题的更多信息:
能用于Windows吗?
短回答:当然 长答案:在 Windows 上使用符号链接至少可以说是有问题的,但是,pnpm 有一个解决方法。 对于 Windows,我们用junctions替代。
但是嵌套的 node_modules
组织方式与 Windows 兼容吗?
npm 的早期版本由于嵌套了所有 node_modules
(参见 这个 issue). 但是,pnpm 不会创建深层文件夹,它使用符号链接来创建依赖关系树结构。
循环 symlinks 呢?
尽管 pnpm 使用链接将依赖项放入 node_modules
文件夹,循环的符号链接已经被避免了,因为父包放置在其依赖项所在 node_modules
文件夹中。 所以 foo
的依赖项不在 foo/node_modules
中,foo
其实和它 依赖项一起在 node_modules
中。
为什么使用硬链接? 为什么不直接创建到全局存储的符号链接?
一台机器上一个包在可以有不同的依赖集。
在项目 A foo@1.0.0
可以具有一个依赖被解析为 bar@1.0.0
,但在项目 B 中 foo
的依赖可能会被解析至 bar@1.1.0
; 因此,pnpm 硬链接 foo@1.0.0
到每个使用它的项目,以便为其创建不同的依赖项集。
直接软链至全局存储与 Node 的 --preserve-symlinks
标志一起使用是可行的,但是,该方法附带了个自己的问题,因此我们决定使用硬链接。 有关为何作出决定的详情,请参阅 这个 issue。
pnpm 是否可以在 Btrfs 分区中的不同子卷工作?
虽然 Btrfs 不允许单个分区中不同子卷之间的跨设备硬链接,但它允许引用链接。 因此,pnpm 利用引用链接在这些子卷之间共享数据。