Часті питання
Чому моя тека node_modules
використовує місце на диску, якщо пакунки зберігаються у глобальному сховищі?
pnpm створює жорсткі посилання з глобального сховища на теки node_modules
проєкту. Жорсткі посилання вказують на те саме місце на диску, де знаходяться оригінальні файли. Так, наприклад, якщо у вашому проєкті є залежність foo
і вона займає 1 Мб місця, то це виглядатиме так, ніби вона займає 1 Мб місця у теці проєкту node_modules
і стільки ж місця у глобальному сховищі. Однак цей 1 Мб — це той самий простір на диску, до якого звертаються з двох різних місць. Отже, загалом foo займає 1 Мб, а не 2 Мб.
Більше на цю тему:
- Чому здається, що жорсткі посилання займають стільки ж місця, скільки й оригінали?
- Спілкування в чаті pnpm
- Тікет в репо pnpm
Чи підтримується Windows?
Коротка відповідь: Так. Довга відповідь: використання символьних посилань у Windows, м'яко кажучи, проблематичне, однак pnpm має обхідний шлях. Для Windows ми натомість використовуємо junctions.
Але підхід вкладення node_modules
несумісний із Windows?
Ранні версії npm мали проблеми через вкладеність усіх node_modules
(див. цей тікет). Однак pnpm не створює глибоких тек, він зберігає всі пакунки безперервно та використовує символьні посилання для створення структури дерева залежностей.
А як щодо циклічних символічних посилань?
Хоча 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
, однак, цей підхід має безліч власних проблем, тому ми вирішили дотримуватися жорстких посилань. Щоб дізнатися більше про те, чому було прийнято це рішення, перегляньте цей тікет.
Чи працює pnpm у різних підтомах в одному розділі Btrfs?
Хоча Btrfs не дозволяє створювати міжпристрійні жорсткі посилання між різними підтомами одного розділу, він дозволяє створювати reflink. Як наслідок, pnpm використовує посилання для обміну даними між цими підтомами.