Комментарии 14
Node.js-проекты, в которых лучше не использовать lock-файлы
выглядит так, будто вы собираетесь их поименно перечислить, проекты эти…
Сравним с оригиналом: «When Not to Use Lock Files with Node.js» — тоже не фонтан, конечно (не понятно, о каких локфайлах автор), но это «Когда не стоит использовать локфайлы в node.js»
npm с 5-ой версии при обновлении затрагивает не только ваши зависимости, а и зависимости зависимостей (ЗЗ). В случае появления ошибки в ЗЗ+ исправить ее можно будет только вручную пропатчив код конкретной зависимости, зафиксировать ее в своем проекте не выйдет.
Это значит, что при сборке и заливке на production приложения вы не знаете, какие зависимости подтянутся в процессе.
Пример: https://github.com/raml-org/raml-js-parser-2/issues/775, так получилось, что этот пакет был зависимостью 3-го уровня, фактически мы получили не работающее приложение, без возможности зафиксировать рабочую версию ЗЗЗ.
К чему я это все? Локфайлы необходимы. Мне не ясны причины такого наплевательского отношения команды npm к этой проблеме. Так же не ясна причина появления shrinkwrap, если уже есть package-lock.
На данный момент рабочий вариант работы с зависимостями:
yarn install --ignore-optional --frozen-lockfile --non-interactive
— Должен получить зависимости от зависимости согласно semver версиям указанным в засисимости. Если бы лок файл зависимости учитывался, то использовались бы зависимости на момент публикации что было бы плохой идее в большинстве случаев.
— Сам ответственен за работоспособность своего модуля. То есть проверяется работоспособность всей системы/модуля и лочатся все зависимости включая транзитивные при любом обновлении модулей. Это отвественность потребителя/консьюмера модуля.
Я правильно понимаю, что лок-файл — это способ узнать "с какими версиями зависимостей разработчик библиотеки её проверял" и эту информацию предлагается от пользователей библиотеки умышленно скрыть? Весело у вас в мире джаваскрипта.
Если разработчик библиотеки захочет привязаться к конкретным версиям своих зависимостей, он может легко это сделать, указав их в package.json
, то есть написать "lodash": "4.17.11"
, вместо "lodash": "4.x.x"
. Но этого не делают по двум причинам:
- Фиксированные версии ухудшают дедупликацию зависимостей. Если одна библиотека запросит lodash строго 4.17.11, а другая строго 4.17.9, то они получат ровно эти версии, хотя они фактически ничем не отличаются, по правилам semver все 4.x релизы совместимы. В самом запущенном случае у вас может оказаться 43 копии lodash – вся линейка их релизов 4й версии.
- Если зафисировать версии своих зависимостей, пользователи не получат баг-фиксы в них. В результате пользователи завалят вас запросами на обновление зависимостей. Примеры: раз, два, три. Если у вас много зависимостей, то придется каждую неделю выпускать такой псевдо-релиз.
А нынешняя ситуация всех устраивает. Авторы пакетов указывают допустимый диапазон версий и не отвлекаются на рутинные обновления. Пользователи записывают конкретные версии в package-lock и получают воспроизводимую сборку.
«Совместима с» — это package.json, а «тестировал с» — это лок-файл. Никто вам как пользователю библиотеки не запрещает положить болт как на одно, так и на другое, и насильно запустить мою библиотеку с другой версией lodash. Но зачем вы хотите убрать информацию о том с какой версией проверялась работоспособность?
А как эту информацию можно использовать? Допустим, эта информация есть, вы запускаете npm install, и дальше что происходит?
1. Молча взять максимальную из требуемых
2. Потребовать пользователя выбрать
3. Поюзать _обе_ версии. Не во всех языках и окружениях такое возможно
4. Прочие безумия. Например, Maven молча выбирает ту версию, которая ближе по графу зависимостей. Здесь же вариант npm «а давайте забьём на информацию о желаемой библиотекой версии зависимостей». Нет информации — нет проблемы с выбором.
А что мешает указать, версию ^4.17.9
в списке зависимостей? В таком случае вы явно указываете, что надо брать lodash >= 4.17.9, но < 5. Это отлично вписывается в semver и если авторы lodash не будут нарушать правила семантического версионирования, то ваша библиотека не сломается.
Node.js-проекты, в которых лучше не использовать lock-файлы