← All posts tagged Yarn

janPona
безопасность npm Yarn marakgate А теперь про воркфлоу без локфайла, но сначала про ворфлоу с локфайлом.

Что такое локфайл? Это такой огромный json, в котором зафиксированы все зависимости данного пакета. Локфайл имеет одну особенность — пакетный менеджер (будь то npm или yarn) считывает его только для корневого пакета. Но не для зависимостей. «Но почему?!» — спросите вы.

Причина такого (правильного) поведения в том, что, если бы учитывался каждый локфайл каждой библиотеки, то, поскольку в них бы для одних и тех же зависимостей разных библиотек были бы вторичные библиотеки разных версий, пришлось бы устанавливать огромное число дубликатов этих библиотек. Непонятно? Вот пример:

— Мы пишем приложение, пакет называется application.
— application зависит от библиотеки, скажем, виджета для отрисовки таблиц tables@0.1.0.
— tables@0.1.0 зависит от маленькой библиотеки, скажем, leftpad@0.2.0
— но application, кроме этого зависит ещё от одной библиотеки: виджет отрисовки графиков charts@0.1.0
— а charts@0.1.0, в свою очередь, зависит от leftpad@0.2.1 (обратите внимание, версия другая)

Что мы имеем в реальной жизни? В реальной жизни при установке зависимостей нашего application, создастся локфайл, в котором пропишется leftpad@0.2.1. Почему так происходит? Потому что и charts, и tables, во-первых зависят от leftpad мягко, то есть вот так: "leftpad": "^0.2.0" и "leftpad": "^0.2.1". Это даёт пакетному менеджеру определённую свободу выбора компромиссной версии, каковой в данном случае будет leftpad@0.2.1.

А теперь представьте, что было бы, если бы у пакетов charts и tables были бы локфайлы, в которых была бы жёстко зафиксирована зависимость на leftpad двух разных версий (при условии, что эти локфайлы бы принимались всерьёз пакетным менеджером)? В итоговый локфайл приложения попали бы ОБЕ версии. И leftpad@0.2.0 установился бы в node_modules/tables/node_modules, а leftpad@0.2.1 установился бы в node_modules/charts/node_modules. Произошло бы задвоение пакета leftpad. А в реальном проекте таких пакетов были бы сотни, если не тысячи!

Вывод №1. В библиотеках не работает ни package-lock.json, ни yarn.lock, и это так задумано. Кроме того, иметь нефиксированные номера версий зависимостей — правильно. Это позволяет пакетному менеджеру устанавливать пакеты экономно, без дубликатов.

Продолжение в комментариях.