Пряжа: использовать yarn.lock зависимостей
Я использую пряжу для установки пакетов непосредственно из GitLab компании:
yarn add git+ssh://<user>@<host>:<repo>
Для зависимостей первого уровня я использую yarn --pure-lockfile
реконструировать мой node_modules
в соответствии с yarn.lock
,
Однако для зависимостей второго уровня пряжа, кажется, всегда устанавливает последнюю версию.
Так скажем, я зависим от A
который тестируется с определенной версией B
, В package.json
Я не указываю версию, но она содержится в yarn.lock
,
Когда я сейчас устанавливаю пакет A
пряжа получит последнюю версию B
несмотря на запись в A/yarn.lock
Я знаю, что могу решить эту проблему, передав конкретную версию в A/package.json
(по крайней мере, я думаю).
Но есть ли возможность сказать пряжи, чтобы посмотреть на yarn.lock
зависимостей?
1 ответ
TLDR:
Когда вы устанавливаете зависимости в вашем приложении, учитывается только ваш собственный файл yarn.lock. Файлы блокировки в ваших зависимостях будут игнорироваться. Ссылка
Давайте сначала проясним некоторые вещи:
--pure-lockfile
такой же, как обычная установка пряжи, за исключением того, что она не будет генерироватьyarn.lock
файл или обновить один, если присутствует.- Пряжа всегда читает из
yarn.lock
по умолчанию для разрешения зависимостей при установке, если не поставляется с--no-lockfile
, Таким образом, нет необходимости говорить это читатьyarn.lock
,
Что такое yarn.lock
используется для?
yarn.lock
используется для решения того, что version
должны быть получены с учетом semver version
модуля в package.json
, Не используется для определения того, что semver version
следует ли разрешить модуль в. Это просто не его вариант использования.
Как упомянуто в Yarn DOCS: для получения согласованных установок на разных компьютерах Yarn требуется больше информации, чем зависимости, которые вы настраиваете в своем пакете json. Yarn должен точно хранить версии каждой зависимости, которые были установлены.
Для этого пряжа использует
yarn.lock
файл в корне вашего проекта.
Итак, для решения semver version
зависимости, пряжа всегда зависит от package.json
, Для данного semver version
пряжа проверяет yarn.lock
файл, чтобы увидеть, что version
если это принесет. Это то, что делает пряжу детерминированной (та же техника используется npm
который использует npm-shrinkwrap.json
).
Пример: Semver Версии как ^1.2.4
можно разрешить на любой номер версии, который >= 1.2.3 and < 2.0.0
, Без пряжи npm установится 1.2.4
в одной машине но 1.9.9
в другой машине, в зависимости от последней версии, присутствующей на момент установки. Это проблема, которую пряжа решает, используя yarn.lock
,
semver version
определяетсяpackage.json
файл.yarn.lock
Файл - это только поиск, для которого требуется установить версию и коммит хеша для данногоsemver version
число.
Как пряжа разрешает версию модуля с учетом его полуверсии?
Предположим, что в настоящее время наш файл yarn.lock выглядит так:
bluebird@2.9.6:
version "2.9.6"
resolved "https://<...>/bluebird-2.9.6.tgz#1fc3a6b1685267dc121b5ec89b32ce069d81ab7d"
bluebird@^2.9.30:
version "2.11.0"
resolved "https://<...>/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
...
myModule@5.1.0:
version "5.1.0"
resolved "https://<...>/moduleA-5.1.0.tgz#ce97130858add59d616ee80675383b0c127290a0"
dependencies:
bluebird "^1.0.0"
- Если package.json имеет
bluebird: "^2.9.30"
, пряжа ищет записьbluebird@^2.9.30
в файле блокировки. Это присутствует и, следовательно, решеноversion=2.11.0
, - Если package.json имеет
bluebird: "^2.9.0"
, пряжа ищет записьbluebird@^2.9.0
в файле блокировки. Этого нет. Предположим, что последняя стабильная версия, которая удовлетворяет критериям semver,2.13.0
, тогда пряжа добавляет запись дляbluebird@^2.9.0
, решено2.13.0
, При разрешении версии для данногоsemver version
для bluebird не имеет значения, какая запись присутствует для bluebird в зависимостях moduleA в файле блокировки.
Semver Version
не зависит от того, какие записи присутствуют в карте зависимостей для модуля вyarn.lock
файл.
Итак, если package.json имеет bluebird: ""
, пряжа ищет запись bluebird@
в файле блокировки, но не может его найти. Следовательно, это решает bluebird: ""
до последней версии, предположим 3.5.0
, Теперь пряжа добавит запись для bluebird@
решено 3.5.0
,
bluebird@:
version "3.5.0"
resolved "https://<...>/bluebird-3.5.0.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
Форма теперь на всякий раз, когда пряжа сталкивается {bluebird: ""}
, он найдет запись для bluebird@
в файле блокировки и, следовательно, всегда будет разрешать его 3.5.0
,
Решение вашей проблемы
Разрешить B: ""
к версии сказать 1.0.0
, вам нужно иметь запись для B@
в yarn.lock
решено 1.0.0
, Однажды, yarn.lock
есть запись для B@
все последующие установки всегда будут получать версию 1.0.0
за B=""
,
Ниже приведены шаги, которые необходимо предпринять, чтобы сделать то же самое:
Подход 1 (рекомендуется)
Если вы хотите, чтобы B разрешил до последней версии:
- добавлять
B:""
в упаковке A.json - Бежать
yarn install
, Это добавит запись дляB@
разрешено до последней версии. - От себя
yarn.lock
файл. - Форма теперь на том, кто бежит
yarn install
получит ту же версию.
Подход 2
Если вы хотите, чтобы B имел более старую версию: (Настоятельно не рекомендуется)
- добавлять
B: 1.0.0
в пакете A.json. - Бежать
yarn install
, Это добавит записьB@1.0.0
в файле блокировки. - добавлять
B@
рядомB@1.0.0
в пряжи.B@, B@1.0.0: ...
- Изменить версию B на
""
в пакете A.json. - От себя
yarn.lock
файл. - Форма теперь на том, кто бежит
yarn install
получит версию B как1.0.0
,
Этот подход очень опасен, так как вы можете легко что-то сломать. Ваш файл yarn.lock всегда должен управляться пряжей.
Подход 3 (рекомендуется)
Если вы хотите, чтобы B остался на 1.0.0
- Исправить версию B в
1.0.0
в пакете A.json. - Бежать
yarn install
, Это добавит записьB@1.0.0
в файле блокировки. - Push-файл yarn.lock
- Форма теперь на том, кто бежит
yarn install
получит версию B как1.0.0
,
Изменить: Использование файла yarn.lock, присутствующего в зависимостях
Если вы проверите этот документ:, они четко упомянули, что yarn будет использовать только файл верхнего уровня yarn.lock и игнорирует файлы блокировки, присутствующие в зависимостях.
В настоящее время нет способа заблокировать зависимости второго уровня, используя в них yarn.lock. Я не вижу в этом необходимости. На самом деле создатели пряжи объясняют, почему это так. Причины:
- Версии, которые должны быть установлены для зависимостей второго уровня, могут быть хорошо записаны в файле yarn.lock верхнего уровня, как я объяснил выше.
- Вы никогда не сможете обновить версии зависимостей в вашем собственном приложении при их непосредственном использовании, поскольку они будут заблокированы другими файлами yarn.lock. В этом можно убедиться, объяснив, как пряжа разрешает зависимости.
- Yarn никогда не сможет складывать (дедуплицировать) зависимости, чтобы совместимые диапазоны версий устанавливали только одну версию.
Также, как и в вашем случае использования, если A имеет зависимость B, которая работает только с версией 1.0.0
, Пакет A.json должен иметь версию, упомянутую для B как 1.0.0
и не "". Вы всегда можете исправить свой верхний уровень yarn.lock
добавить запись для B@
решено 1.0.0
но не рекомендуется вручную исправлять файл yarn.lock, как я уже упоминал выше.
Надеюсь, это помогло! Пожалуйста, напишите мне в комментариях для любых сомнений.