Стоит ли фиксировать файл yarn.lock и для чего он нужен?

Yarn создает файл yarn.lock после выполнения yarn install.

Следует передать это в репозиторий или проигнорировать? Для чего это?


person rlay3    schedule 12.10.2016    source источник
comment
IMHO, этот вопрос (и большинство ответов ниже) неполные из-за отсутствия вопроса о том, как и когда мы должны регенерировать файл yarn.lock?   -  person MarkHu    schedule 21.06.2018
comment
Теперь вы знаете, как и когда?   -  person jayarjo    schedule 18.10.2018
comment
@MarkHu нашел его здесь: yarnpkg.com/lang / en / docs / yarn-lock / # toc-managed-by-yarn Итак, в основном: Your yarn.lock file is auto-generated and should be handled entirely by Yarn. As you add/upgrade/remove dependencies with the Yarn CLI, it will automatically update your yarn.lock file.   -  person jayarjo    schedule 18.10.2018
comment
Связанный: stackoverflow.com/questions/45614973/   -  person k0pernikus    schedule 09.12.2019


Ответы (9)


Да, вам следует проверить это, см. Переход с npm

Для чего это нужно?
Клиент npm недетерминированно устанавливает зависимости в node_modules каталог. Это означает, что на основе установленных зависимостей порядка структура каталога node_modules может отличаться от одного человека к другому. Эти различия могут вызвать ошибки работает на моем компьютере, на поиск которых потребуется много времени.

Yarn решает эти проблемы, связанные с управлением версиями и недетерминизмом, с помощью файлов блокировки и алгоритма установки, который является детерминированным и надежным. Эти файлы блокировки блокируют установленные зависимости для конкретной версии и гарантируют, что каждая установка приводит к одинаковой файловой структуре node_modules на всех машинах.

person ckuijjer    schedule 12.10.2016
comment
Хорошая находка. Я нашел следующее из их docs, который отвечает, для чего он нужен ?: Клиент npm недетерминированно устанавливает зависимости в каталог node_modules. Это означает, что на основе установленных зависимостей порядка структура каталога node_modules может отличаться от одного человека к другому. Эти различия могут вызвать ошибки «работает на моей машине», на поиск которых потребуется много времени. - person rlay3; 13.10.2016
comment
Продолжение: Yarn решает эти проблемы, связанные с управлением версиями и недетерминизмом, с помощью файлов блокировки и алгоритма установки, который является детерминированным и надежным. Эти файлы блокировки блокируют установленные зависимости для конкретной версии и гарантируют, что каждая установка приводит к точно такой же файловой структуре в node_modules на всех машинах. - person rlay3; 13.10.2016
comment
Вместо того, чтобы сказать, что файл блокировки не найден. Он должен просто сказать «Создание файла yarn.lock». Угу :) Это не ошибка, но первое звучит как ошибка. И последнее будет достаточно тревожным для всех, кто участвует в обратном сценарии (где они ожидают иметь файл yarn.lock, но, по-видимому, не имеют). - person Alexander Mills; 03.12.2016
comment
Я ценю, что yarn.lock блокирует наш проект для определенных версий пакета, но я считаю, что использование слова «блокировка» является неудачным. Обычно файлы блокировки (например, . ldb) являются средством ограничения ресурса одним процессом за раз, чтобы предотвратить обновления могут вызвать повреждение. Такие файлы блокировки определенно не следует передавать в систему контроля версий, что, возможно, является причиной большей части путаницы с yarn.lock. - person Antony; 27.06.2017
comment
Мне очень не нравится фраза, что вам не нужно читать или понимать этот файл. Это важный файл для поддержки вашего проекта. - person Nathan Goings; 10.07.2019
comment
yarn install изменит yarn.lock файл, хотя по умолчанию. Чтобы убедиться, что он проверяет, что packlage.json и yarn.lock синхронизированы и не просто обновляют зависимости, вам лучше установить зависимости через yarn install --frozen-lockfile. Я использую это при разработке и на своих серверах CI. Только если я хочу обновить пакеты для обновления, я использую yarn install. См .: github.com/yarnpkg/yarn/issues/4147. - person k0pernikus; 27.09.2019

Зависит от вашего проекта:

  1. Ваш проект - приложение? Затем: Да
  2. Ваш проект - это библиотека? Если да: Нет.

Более подробное описание этого можно найти в этом выпуске GitHub, где один из создателей Yarn например. говорит:

Package.json описывает предполагаемые версии, желаемые исходным автором, а yarn.lock описывает последнюю известную удачную конфигурацию для данного приложения.

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

person VoxPelli    schedule 23.10.2016
comment
С другой стороны, не повлияет ли наличие файла блокировки в библиотечных проектах на воспроизводимость соответствующих тестов? - person E_net4 the curator; 22.11.2016
comment
Если я правильно прочитал ваше описание, то ваш проект является библиотекой? можно было бы ответить, если хотите. У него нет недостатков, но он может быть полезен, если у вас есть сложные devDependencies и вы хотите, чтобы каждый разработчик вашей библиотеки имел одинаковые сценарии сборки и тестирования. Верно? - person Pipo; 23.11.2016
comment
Поскольку файл блокировки не будет соблюдаться ни одним из пользователей вашей библиотеки, то использование его при разработке библиотеки может дать ложное ощущение безопасности. - person VoxPelli; 23.11.2016
comment
Dart имеет ту же систему с pubspec.yaml и pubspec.lock и рекомендует то же, что и в ответе. См. этот вопрос и эту запись документации. - person Jonas Kello; 02.12.2016
comment
См. Эту запись в официальном блоге Yarn: Файлы блокировки должны фиксироваться на всех проекты - person E_net4 the curator; 02.12.2016
comment
Для справки: влиятельные разработчики node.js, такие как Синдре Сорхус, разделяют похожие мысли: github. ru / sindresorhus / ama / issues / 479 # issuecomment-310661514 - person VoxPelli; 16.08.2019
comment
Примечание. Главный разработчик Yarn возражает против этого: twitter.com/arcanis/status/1164229994165559299 - person VoxPelli; 09.09.2019

Я вижу, что это два отдельных вопроса в одном. Позвольте мне ответить на оба вопроса.

Следует ли передать файл в репозиторий?

да. Как упоминалось в ответе ckuijjer, это рекомендуется в Руководство по миграции, чтобы включить этот файл в репо. Прочтите, чтобы понять, зачем вам это нужно.

Что такое yarn.lock?

Это файл, в котором хранятся точные версии зависимостей для вашего проекта вместе с контрольными суммами для каждого пакета. Это способ yarn обеспечить согласованность ваших зависимостей.

Чтобы понять, зачем нужен этот файл, вам сначала нужно понять, в чем заключалась проблема package.json оригинального NPM. Когда вы устанавливаете пакет, NPM сохранит диапазон разрешенных ревизий зависимости вместо конкретной ревизии (semver). NPM попытается получить обновление зависимости от последней версии зависимости в указанном диапазоне (т. Е. Неразрывные обновления исправлений). У этого подхода есть две проблемы.

  1. Авторы зависимостей могут выпускать обновления версий патчей, фактически внося критические изменения, которые повлияют на ваш проект.

  2. Два разработчика, запускающие npm install в разное время, могут получить разный набор зависимостей. Это может привести к тому, что ошибка не будет воспроизводиться в двух абсолютно одинаковых средах. Это может вызвать проблемы со стабильностью сборки, например, для серверов CI.

С другой стороны, пряжа идет по пути максимальной предсказуемости. Он создает yarn.lock файл для сохранения точных версий зависимостей. Имея этот файл на месте, yarn будет использовать версии, хранящиеся в yarn.lock, вместо разрешения версий из package.json. Эта стратегия гарантирует, что ни одна из проблем, описанных выше, не возникнет.

yarn.lock аналогичен npm-shrinkwrap.json, который может быть создан командой npm shrinkwrap. Проверьте этот ответ, объясняя различия между этими двумя файлами.

person Juriy    schedule 24.10.2016
comment
Но я вижу, что yarn.lock обновляется время от времени, вы знаете, почему и когда yarn это происходит? - person jayarjo; 18.10.2018
comment
Проблемы с пряжей # 4379 и # 4147 предлагает yarn обновлять yarn.lock во многих случаях, включая запуск yarn install без изменений в package.json. Использование yarn install --frozen-lockfile, как предлагается в Почему запуск пряжи в Windows меняет пряжу. lock (или настроить его через .yarnrc) кажется лучшим вариантом. - person Lauri Harpf; 10.05.2019
comment
npm в настоящее время имеет package-lock.json и npm ci. Этот рабочий процесс аналогичен yarn.lock и yarn install --frozen-lockfile пряжи. - person k0pernikus; 27.09.2019

Вам следует:

  1. добавить его в репозиторий и зафиксировать
  2. используйте yarn install --frozen-lockfile и НЕ yarn install по умолчанию как локально, так и на серверах сборки CI.

(Я открыл тикет в системе отслеживания проблем пряжи, чтобы убедить вас в необходимости использовать поведение по умолчанию для замороженного файла блокировки, см. # 4147).


Не устанавливайте флаг frozen-lockfile в файле .yarnrc, так как это помешает вам синхронизировать файлы package.json и yarn.lock. См. Соответствующую проблему с пряжей на github


yarn install может неожиданно изменить ваш yarn.lock, в результате чего претензии пряжи на повторяющиеся сборки станут недействительными. Вы должны использовать yarn install только для инициализации yarn.lock и его обновления.

Кроме того, особенно. в более крупных командах у вас может быть много шума из-за изменений в замке пряжи только потому, что разработчик настраивал свой локальный проект.

Для получения дополнительной информации прочтите мой ответ о пакете npm package-lock.json, поскольку это также применимо и здесь.


Это также недавно было ясно указано в документации по установке пряжи:

yarn install

Установите все зависимости, перечисленные в package.json, в локальную папку node_modules.

Файл yarn.lock используется следующим образом:

  • Если yarn.lock присутствует и его достаточно для удовлетворения всех зависимостей, перечисленных в package.json, будут установлены точные версии, записанные в yarn.lock, и yarn.lock не изменится. Yarn не проверяет наличие более новых версий.
  • Если yarn.lock отсутствует или его недостаточно для удовлетворения всех зависимостей, перечисленных в package.json (например, если вы вручную добавляете зависимость в package.json), Yarn ищет новейшие доступные версии, которые удовлетворяют ограничениям в пакете. .json. Результаты записываются в yarn.lock.

Если вы хотите, чтобы yarn.lock не обновлялся, используйте --frozen-lockfile.

person k0pernikus    schedule 27.09.2019
comment
Хотя это правда, я могу подумать, что вы должны использовать --frozen-lockfile только тогда, когда кто-то вручную обновил package.json без последующего запуска yarn install и фиксации обновлений. Таким образом, CI может захотеть использовать этот флаг, но разработчики не должны, потому что он скрывает проблемы. - person jkrehm; 04.02.2020
comment
@jkrehm Зависит от того, что вы подразумеваете под скрытием проблем. У меня было больше проблем с неожиданно измененными yarn.lock файлами, введенными yarn install, либо из-за раздувания запросов на вытягивание, либо из-за ненужных конфликтов слияния, либо из-за извлечения сломанной библиотеки. (Только потому, что библиотека использует semvar, это не значит, что исправление / незначительное обновление не сломает ваше приложение - я был там). Я считаю, что обновление yarn.lock должно выполняться только вручную, поэтому я полагаюсь на yarn install --frozen-lockfilenpm ci в проектах npm) даже на своей машине разработки, поскольку она надежна и детерминирована. - person k0pernikus; 04.02.2020
comment
У меня никогда не было проблем с неожиданным обновлением yarn.lock (использую с октября 2016 года, когда оно вышло). Это всегда был пользователь, выполняющий что-то вручную, или паршивый сценарий после установки. По этой причине я предпочитаю Yarn, а не NPM (NPM обновляет все в любое время, когда захочет). Думаю, мне повезло, что я не столкнулся с этими проблемами. - person jkrehm; 07.02.2020

Думаю, да, поскольку Yarn использует собственный файл yarn.lock: https://github.com/yarnpkg/yarn

Он используется для детерминированного разрешения зависимостей пакетов.

person jarekwg    schedule 12.10.2016

По своему опыту я бы сказал, что да, мы должны зафиксировать yarn.lock файл. Это гарантирует, что когда другие люди будут использовать ваш проект, они получат те же зависимости, что и ваш проект.

Из документа

Когда вы запускаете yarn или yarn add, Yarn сгенерирует файл yarn.lock в корневом каталоге вашего пакета. Вам не нужно читать или понимать этот файл - просто зарегистрируйте его в системе контроля версий. Когда другие люди начнут использовать Yarn вместо npm, файл yarn.lock гарантирует, что они получат точно такие же зависимости, как и вы.

Можно утверждать, что мы можем добиться этого, заменив ^ на --. Да, мы можем, но в целом мы видели, что большинство npm пакетов поставляется с ^ нотацией, и нам приходится изменять нотацию вручную, чтобы гарантировать статическую версию зависимости. Но если вы используете yarn.lock, это программно обеспечит вашу правильную версию.

Также, как сказал Эрик Эллиот, здесь

Не используйте .gitignore yarn.lock. Он нужен для обеспечения детерминированного разрешения зависимостей, чтобы избежать ошибок «работает на моей машине».

person Anshul    schedule 23.12.2016

Да, вы должны это сделать. Дополнительную информацию о файле yarn.lock см. В официальной документации здесь

person Navin prasad    schedule 20.01.2018

Не для того, чтобы играть в адвоката дьявола, но я медленно (с годами) пришел к мысли, что вы НЕ должны фиксировать файлы блокировки.

Я знаю каждую часть имеющейся у них документации, в которой говорится, что вам следует это делать. Но что толку ?! И, на мой взгляд, недостатки намного перевешивают преимущества.

По сути, я потратил бесчисленное количество часов на отладку проблем, которые в конечном итоге были решены путем удаления файлов блокировки. Например, файлы блокировки могут содержать информацию о том, какой реестр пакетов использовать, и в корпоративной среде, где разные пользователи обращаются к разным реестрам, это рецепт катастрофы.

Кроме того, файлы блокировки могут действительно испортить ваше дерево зависимостей. Поскольку yarn и npm создают сложное дерево и хранят внешние модули разных версий в разных местах (например, в папке node_modules внутри модуля в верхней папке node_modules вашего приложения), если вы часто обновляете зависимости, это может создать настоящий беспорядок. Опять же, я потратил массу времени, пытаясь выяснить, какая старая версия модуля все еще использовалась в зависимости, в которой версия модуля была обновлена, только чтобы обнаружить, что удаление файла блокировки и папки node_modules решило все сложные -диагностировать проблемы.

У меня даже есть псевдонимы оболочки, которые удаляют файлы блокировки (а иногда и папки node_modules!) Перед запуском yarn или npm.

Думаю, это всего лишь обратная сторона медали, но слепое следование этой догме может стоить вам ........

person nerdlinger    schedule 20.09.2020
comment
корпоративная среда, в которой разные пользователи обращаются к разным реестрам, я думаю, это само по себе является рецептом катастрофы. Проект должен использовать одни и те же реестры для всех пользователей, иначе у вас возникнут проблемы. - person Vincent McNabb; 04.05.2021
comment
Не могу согласиться, похоже, проблема связана с настройкой вашего предприятия, а не с файлом блокировки. - person Chris; 06.05.2021

Да! yarn.lock необходимо зарегистрировать, чтобы любой разработчик, устанавливающий зависимости, получил точно такой же результат! Например, с помощью npm [который был доступен в октябре 2016 года] вы можете установить patch версию (скажем, 1.2.0) локально, пока новый разработчик запускает новую install может получить другую версию (1.2.1).

person enapupe    schedule 12.10.2016
comment
Упомянутое вами поведение npm зависит от того, как вы сохраняете свои зависимости. Если вы сохраните с --save-exact при использовании npm, вы можете добиться того же поведения. - person AlicanC; 12.10.2016
comment
@AlicanC Я не думаю, что это так просто. Я считаю, что yarn (через зафиксированный файл блокировки) гарантирует одинаковую версию пакетов и всех их зависимостей. Это то, с чем у NPM всегда были проблемы, потому что зависимость зависимости может не быть привязана к конкретной версии, поэтому новая установка может привести к другим зависимостям более низкого уровня. Термоусадочная упаковка NPM должна была решить эту проблему до некоторой степени, но она всегда была сложной и очень часто работала некорректно. - person nextgentech; 12.10.2016
comment
@nextgentech Если в этом случае, как мне убедиться, что зависимость зависимости обновлена ​​правильно? Предположим, у меня есть основной пакет, в котором есть несколько (скажем, 3) зависимых пакета. Я буду следить за изменениями в моем основном пакете и обновлять его в package.json. Но если они обновят какой-либо из трех дополнительных пакетов, как я получу эти изменения? Из-за файла блокировки эти зависимости не будут обновлены, верно? - person Pragatheeswaran; 20.10.2016
comment
Я еще не очень много с этим возился, но считаю, что именно здесь играет роль команда yarn upgrade. Эта команда обновит все пакеты и воссоздает файл блокировки. Так, например, если вы развертываете приложение в производственной среде и вам нужно установить зависимости, это будет сделано на основе файла блокировки, извлеченного из репозитория. Вы никогда не должны запускать yarn upgrade, если вы явно не хотите изменить информацию о зависимостях (и, таким образом, зафиксировать новый файл блокировки). - person nextgentech; 20.10.2016
comment
yarn install не гарантирует одинаковые версии. Только yarn install --frozen-lockfile делает. - person k0pernikus; 27.09.2019