Чи слід вчинити файли yarn.lock і package-lock.json?


118

Ми використовуємо пряжу для всіх наших детермінованих установок на кг, але не перешкоджаємо користувачу використовувати npm - я думаю, що обидва ці файли можуть викликати проблеми. Чи слід додати його до вашого .gitignore dir?


Відповіді:


148

Завжди фіксуйте файли блокування залежностей взагалі

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

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

Тому ви завждиyarn.lockpackage-lock.json повинні скористатися хоча б одним або залежно від того, який менеджер пакунків ви використовуєте.

Чи потрібно вчинити і yarn.lock, і package-lock.json?

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

Якщо ви берете на себе зобов’язання, package-lock.jsonви створюєте підтримку для людей, які встановлюють ваші залежності за допомогою NPM 5. Якщо ви берете на себе зобов’язання yarn.lock, ви створюєте підтримку для людей, які встановлюють залежності за допомогою Пряжі.

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

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


Ці питання були детально обговорені в рамках проекту Пряжа в:

Обидва зараз закриті.


1
Чудова відповідь. Однак щодо Вашої точки зору: "Найбезпечніше, що потрібно зробити, - це генерувати та виконувати їх обидва щоразу, коли ваші залежності змінюються". Я не впевнений, чому це було б "найбезпечнішою" справою. Як ви вже згадували, дуже ймовірно, що "два файли можуть не синхронізуватися". @ відповідь crimbo пояснює цю проблему більш докладно.
TachyonVortex

Я думаю, це може бути різницею в тому, чи зможете ви контролювати всіх людей, які керують вашим проектом. Якщо ви є власником команди, обов'язково стандартизуйте Пряжу та використовуйте yarn.lock. Але якщо це проект з відкритим кодом (як і всі наші), люди можуть використовувати NPM у ваших проектах, навіть якщо ви використовуєте Пряжу всередині. Таким чином, ідеально безпечним є використання автоматизованої системи для того, щоб і yarn.lock, і package-lock.json залишалися синхронізованими. А також тисніть на Пряжу, щоб перейти на 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файли, існує багато способів, щоб два файли могли забезпечити різні дерева залежностей (навіть якщо алгоритми роздільної здатності дерева пряжі та npm є однаковими), і це нетривіально, щоб гарантувати, що вони забезпечують саме те така ж відповідь. Оскільки це нетривіально, навряд чи збережеться одне дерево залежностей в обох файлах, і ви не хочете різної поведінки залежно від того, чи було складено за допомогою пряжі чи npm.

Якщо і коли пряжа переходить з використання yarn.lockна package-lock.json( випуск тут ), то вибір файлу блокування для фіксації стає простим, і нам більше не доведеться турбуватися про пряжу та npm, що призводить до різних збірок. Виходячи з цієї публікації в блозі , цю зміну не слід очікувати найближчим часом (у публікації блогу також описані відмінності між yarn.lockта package-lock.json.


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? У документації зазначено наступне:

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

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


7

Ось моє правило: якщо ви працюєте над додатком, введіть файли блокування. Якщо ви підтримуєте бібліотеку, додайте її до свого ігнорованого списку. У будь-якому випадку ви повинні використовувати точні діапазони semver в package.json. Єгуда Катц ( кешований ) написав чудове пояснення, коли потрібно виконати Gemfile.lock(файл блокування Рубі), а коли - ні. Принаймні прочитайте розділ tl; dr.


Посилання розірвано.
Juha Syrjälä

Дякую @ JuhaSyrjälä. До статті я додав друге посилання.
ravinggenius

Де список ігнорування npm чи пряжі?
neves

"список ігнорування" буде специфічним для джерела сховища вашого проекту (git, mercurial, Subversion). У випадку git, файл викликається .gitignore, і, як правило, в корені проекту.
ravinggenius

4

Ви маєте рацію! Якщо дозволити і те npmй інше, yarnце спричинить проблеми. Погляньте на цю статтю .

Наразі ми плануємо додати деякі попередження користувачам, які використовують як yarn і npmв одному сховищі для встановлення пакетів.

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

Ви можете не хотіти обох npmі yarnяк вашого менеджера пакунків.


2

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

Я вважаю , що найважливіше для користувача є package-lock.json(я, наприклад, не використовувати пряжу) , так це один має бути вчинена.

Для цього yarn.lock, залежить, працюєте ви один або в команді. Якщо соло, то, гадаю, немає необхідності робити це. Якщо ви (плануєте) працювати в команді, то, ймовірно, вам слід це зробити, принаймні, поки пряжа не підтримає її 🙂

Я припускаю, що команда пряжі з часом перестане користуватися yarn.lockта використовувати package-json.lock, в цей час це стане простішим 😛


1
Не перестала використовувати yarn.lock.
jayarjo

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.