Следует ли фиксировать файлы yarn.lock и package-lock.json?

119

Мы используем yarn для всех наших детерминированных установок pkg, но не мешаем пользователю использовать npm - однако я предполагаю, что наличие обоих этих файлов вызовет проблемы. Следует ли добавить его в ваш каталог .gitignore?

Artimus
источник

Ответы:

149

Всегда фиксируйте файлы блокировки зависимостей в целом

Как описано в другом месте, файлы блокировки зависимостей, которые поддерживаются многими системами управления пакетами (например: композитор и сборщик ), должны быть привязаны к базе кода в проектах конца цепочки, чтобы каждый человек, пытающийся запустить этот проект, выполнял так что с точно протестированным набором зависимостей.

Менее ясно, следует ли всегда фиксировать файлы блокировки в пакетах, которые предназначены для включения в другие проекты (где желательны более свободные зависимости). Однако и Yarn, и NPM (как описано в @Cyrille) разумно игнорируют yarn.lockи, package-lock.jsonсоответственно, там, где это необходимо, что делает безопасным всегда фиксировать эти файлы блокировки.

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

Стоит ли фиксировать и yarn.lock, и package-lock.json?

В настоящее время мы имеем две различных системы управления пакетами, которые , как установить один и тот же набор зависимостей от package.json, но которые генерируют и считываемую из двух различных файлов блокировки. NPM 5 генерирует package-lock.json, тогда как Yarn генерирует yarn.lock.

Если вы делаете коммит, package-lock.jsonто вы создаете поддержку для людей, устанавливающих ваши зависимости с помощью NPM 5. Если вы делаете коммит yarn.lock, вы создаете поддержку для людей, устанавливающих зависимости с помощью Yarn.

Независимо от того, выберете ли вы фиксацию yarn.lockили и то, package-lock.jsonи другое, зависит от того, используют ли разработчики вашего проекта только Yarn, NPM 5 или оба. Если ваш проект имеет открытый исходный код, наиболее благоприятным для сообщества способом, вероятно, было бы зафиксировать оба и иметь автоматизированный процесс, чтобы гарантировать yarn.lockи package-lock.jsonвсегда оставаться в синхронизации.

Обновление: в Yarn появилась importкоманда, которая будет генерировать yarn.lockфайл из package-lock.jsonфайла. Это может быть полезно для синхронизации двух файлов. (Спасибо @weakish)


Эти вопросы подробно обсуждались в проекте Yarn в:

Оба сейчас закрыты.

Робин Уинслоу
источник
1
Отличный ответ. Однако по поводу вашего пункта: «Самым безопасным вариантом было бы генерировать и фиксировать их каждый раз, когда ваши зависимости меняются». Я не уверен, почему это было бы «самым безопасным» способом. Как вы упомянули, весьма вероятно, что «два файла могут не синхронизироваться». Ответ @crimbo более подробно объясняет эту проблему.
TachyonVortex
Я думаю, это может повлиять на то, сможете ли вы контролировать всех людей, которые запускают ваш проект. Если у вас есть команда, конечно, стандартизируйте Yarn и используйте yarn.lock. Но если это проект с открытым исходным кодом (как и все наши), люди вполне могут использовать NPM в ваших проектах, даже если вы используете Yarn внутри компании. Таким образом, самый безопасный идеальный вариант - использовать автоматизированную систему для обеспечения синхронизации yarn.lock и package-lock.json. А также заставьте Yarn переключиться на package-lock.json.
Робин Уинслоу,
1
yarn importбыл представлен в 2018 году. yarnpkg.com/blog/2018/06/04/yarn-import-package-lock
слабый
18

Вы должны зафиксировать 1 файл блокировки дерева зависимостей, но не должны фиксировать оба. Это также требует стандартизации пряжи или npm (но не обоих) для создания и разработки проекта.

Вот статья о пряжи о том, почему следует использовать yarn.lock, если вы стандартизируете пряжу.

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

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

crimbo
источник
11

Я думал над тем же вопросом. Вот мои мысли, надеюсь, это поможет:

В документации npm package-lock.json говорится следующее:

package-lock.json автоматически создается для любых операций, в которых npm изменяет дерево node_modules или package.json. Он описывает точное дерево, которое было сгенерировано, так что последующие установки могут генерировать идентичные деревья, независимо от промежуточных обновлений зависимостей.

Это здорово, потому что предотвращает эффект «работает на моей машине».

Без этого файла, если вы npm install --save A, npm добавит "A": "^1.2.3"в ваш package.json. Когда кто - то еще работает npm installнад проектом, вполне возможно , что версия 1.2.4о Aбыла выпущена. Поскольку это последняя доступная версия, которая удовлетворяет диапазону semver, указанному в вашем package.json, она установит эту версию. Но что, если в этой версии появилась новая ошибка? У этого человека возникнет проблема, которую вы не сможете воспроизвести, потому что у вас есть предыдущая версия без каких-либо ошибок.

Исправляя состояние вашего node_modulesкаталога, package-lock.jsonфайл предотвращает эту проблему, потому что у всех будут одинаковые версии всех пакетов.

Но что, если вы пишете и публикуете модуль npm? В документации сказано следующее:

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

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

Сирил
источник
7

Вот мое практическое правило: если вы работаете над приложением, зафиксируйте файл (ы) блокировки. Если вы поддерживаете библиотеку, добавьте ее в список игнорируемых. В любом случае вы должны использовать точные диапазоны семвера в package.json. Иегуда Кацкэше ) написал отличное объяснение, когда делать коммит Gemfile.lock(файл блокировки Ruby), а когда нет. По крайней мере, прочтите раздел tl; dr.

ravinggenius
источник
Ссылка не работает.
Juha Syrjälä
Спасибо @ JuhaSyrjälä. Я добавил вторую ссылку на статью.
ravinggenius
Где список игнорирования для npm или пряжи?
neves
«Список игнорирования» будет специфичным для исходного репозитория вашего проекта (git, mercurial, Subversion). В случае git файл вызывается .gitignoreи обычно находится в корне проекта.
ravinggenius
4

Вы правы! Разрешение использовать оба npmи yarnвызовет проблемы. Взгляните на эту статью .

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

Мы настоятельно рекомендуем вам удалить package-lock.jsonфайл, если вы решите использовать пряжу, чтобы избежать путаницы в будущем и возможных проблем с согласованностью.

Возможно, вам не нужны оба npmи в yarnкачестве менеджера пакетов.

BinaryJoe01
источник
2

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

Я считаю , что самое важное для пользователя является package-lock.json(я, например, не использовать пряжу) , так это один имеет быть совершено.

Что касается yarn.lock, это зависит от того, работаете ли вы в одиночку или в команде. Если соло, то, полагаю, нет необходимости совершать это. Если вы (планируете) работать в команде, то вам, вероятно, следует зафиксировать это, по крайней мере, пока yarn не поддерживает это 🙂

Я полагаю, что команда пряжи в конечном итоге перестанет использовать yarn.lockи будет использовать package-json.lockвместо этого, на этот раз это станет проще 😛

dohzya
источник
1
Они не перестали использовать yarn.lock.
jayarjo
0

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

AndrewSteinheiser
источник