Yarn: Добавление новой зависимости не учитывает существующее ограничение версии в разрешении

Созданный на 11 окт. 2017  ·  4Комментарии  ·  Источник: yarnpkg/yarn

Вы хотите запросить функцию или сообщить об ошибке ?
Ошибка.

Каково текущее поведение?
Yarn не соблюдает уже добавленные блокировки версий при разрешении зависимостей только что добавленных зависимостей.

Если текущее поведение является ошибкой, укажите шаги для воспроизведения.

  1. Запустить пустой модуль
  2. Добавить реакцию 15.6.1 yarn add [email protected]
  3. Добавить [email protected] yarn add [email protected]
  4. Ошибка воспроизводится, и установлены две разные версии реагирования:
$ 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, и это все еще воспроизводится.

cat-bug high-priority triaged

Самый полезный комментарий

Посмотрим на это сегодня 👍

Все 4 Комментарий

Я копаюсь в этом ...

Обратите внимание на то, что параметры, переданные в 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;
Была ли эта страница полезной?
0 / 5 - 0 рейтинги