Вы хотите запросить функцию или сообщить об ошибке ?
Ошибка.
Каково текущее поведение?
Yarn не соблюдает уже добавленные блокировки версий при разрешении зависимостей только что добавленных зависимостей.
Если текущее поведение является ошибкой, укажите шаги для воспроизведения.
yarn add [email protected]
yarn add [email protected]
$ yarn list react
yarn list v1.1.0
├─ [email protected]
└─ [email protected]
└─ [email protected]
✨ Done in 0.24s.
Какое поведение ожидается?
Ожидается, что будет установлен только [email protected] , поскольку он может выполнять все ограничения версии. Вот что произойдет, если я удалю yarn.lock
после того, как обе зависимости будут в package.json и yarn install
ie.
$ rm -rf node_modules/ yarn.lock && yarn install && yarn list react
yarn list v1.1.0
└─ [email protected]
✨ Done in 0.17s.
Пожалуйста, укажите ваш node.js, yarn и версию операционной системы.
$ node --version
v6.9.4
$ yarn --version
1.2.0
$ system_profiler SPSoftwareDataType|grep "System Version"
System Version: macOS 10.12.6 (16G29)
РЕДАКТИРОВАТЬ: исходное воспроизведение было выполнено с пряжей v.1.1.0, но я обновился до 1.2.0, и это все еще воспроизводится.
Я копаюсь в этом ...
Обратите внимание на то, что параметры, переданные в PackageResolver.getHighestRangeVersionMatch(name, range, manifest)
могут быть неверными. Переданный range
кажется фактической разрешенной единственной версией ( 15.6.2
) вместо запрошенного диапазона ( ^15.5.4
).
Это, в свою очередь, дорабатывается до строки, в которой проверяется, соответствуют ли какие-либо текущие установленные версии диапазону semver: semver.maxSatisfying(["15.6.1"], '15.6.2'); // null
Если был передан правильный диапазон, то он выполнил бы semver.maxSatisfying(["15.6.1"], '^15.5.4'); // 15.6.1
который должен решить эту проблему.
Я продолжу возвращаться по коду ...
Хорошо, похоже, это было введено # 3729, а именно строкой в package-request.js
:
const solvedRange = semver.validRange(range) ? info.version : range;
Поэтому, если диапазон ( ^15.5.4
) допустим, мы используем вместо него info.version
( 15.6.2
).
Это передается вниз, чтобы увидеть, соответствуют ли какие-либо установленные версии 15.6.2
:
const maxValidRange = semver.maxSatisfying(['15.6.1'], '15.6.2'); // null
@arcanis похоже, что связанный PR был вашим. Я не решаюсь что-либо менять и рискую снова открыть то, что исправил этот PR. Не могли бы вы протянуть руку помощи?
Посмотрим на это сегодня 👍
Ооо, давайте попробуем это исправить! Мне не нравится, что пакеты полагаются на подъем (запомните мои слова - даже если мы исправим это, они снова сломаются в будущем), но мы делаем его менее эффективным, чем могло бы быть. Репост того, что поставил на # 5561:
Я не совсем понимаю приведенную выше логику. если диапазон - допустимый семвер, то не использовать его?
Вы правы, это не имеет большого смысла: / Я думаю, что я хотел сделать следующее: «Если это не версия, а диапазон, то по возможности используйте тот, который у нас уже есть» (поскольку цель PR было не делать оптимизацию при чтении из файла блокировки). Таким образом, состояние, вероятно, должно быть:
const solvedRange = semver.valid(range) && !semver.validRange(range) ? range : info.version;
Самый полезный комментарий
Посмотрим на это сегодня 👍