Почему сборка автомобиля go не показывает ошибки компиляции с несовместимыми зависимостями? - PullRequest
0 голосов
/ 01 мая 2020

Поскольку эта проблема включает в себя несколько зависимостей, и я не уверен, в каком направлении искать ее воспроизведение, я надеюсь, что это хорошо, если спросить ее, основываясь на конкретном примере c. Более общая закономерность этого вопроса такова: существует цепочка зависимостей user => libExtension => libBase, а libExtension и libBase несовместимы.

В проекте geo-booleanop , мы сталкиваемся с интересной проблемой , которую мы не можем полностью понять. Он включает взаимодействие следующих пакетов:

  • гео-типов (libBase) : базовая библиотека, которая предоставляет базовые c типы, такие как линии, линии, многоугольники и т. д. c.
  • geo-booleanop (libExtension) : здание библиотеки поверх гео-типов, расширяющее его с одной новой функциональностью: новая черта BooleanOp, которая имеет функции типа пересечения / объединения / ... и реализована для типа многоугольника из гео-типов.
  • Любой пользовательский пакет, который объединяет гео-типы и geo-booleanop с намерением использовать черту BooleanOp для полигонов.

Недавно в пакетных гео-типах произошли серьезные изменения, начиная с версии 0.4 до 0.5, например, он изменил некоторые поля его тип Rect от полей публикации до получателей.

Пакет geo-booleanop еще не адаптирован к этому изменению, т. е. он все еще явно использует эти поля публикации. В настоящее время Cargo.toml geo-booleanop указывает geo-types = "0.4", и попытка увеличить его до 0,5 и выполнение cargo build в geo-booleanop приводит к ошибкам компилятора при доступе к полю pub, как и ожидалось.

Теперь удивительная вещь: при создании пользовательского пакета, который объединяет последние версии geo-types и geo-booleanop, мы видим следующий вывод из cargo build в пользовательском пакете:

$ cargo build
[...]
   Compiling geo-booleanop v0.2.1
   Compiling geo-types v0.5.0
[...]

error[E0599]: no method named `union` found for type `geo_types::polygon::Polygon<{float}>` in the current scope
  --> src/main.rs:21:23
   |
21 |     let union = poly1.union(&poly2);
   |                       ^^^^^ method not found in `geo_types::polygon::Polygon<{float}>`

Это удивительно потому что:

  • Компиляция geo-booleanop v0.2.1 в сочетании с гео-типами v0.5.0 вообще не должна быть возможной, потому что они несовместимы.
  • Ошибка об отсутствии метода union вводит в заблуждение, потому что пользовательский код делает все правильно, чтобы перенести черту BooleanOp в область действия, которая должна обеспечить именно этот метод для полигонов.
  • По иронии судьбы компилятор также выдает предупреждение о том, что BooleanOp импорт черт не используется.

Мои вопросы:

  • Почему cargo build не показывает ошибки компиляции, выделите о несовместимости зависимостей?
  • Если это так, можем ли мы что-нибудь сделать на сайте geo-booleanop, чтобы облегчить такие проблемы для наших пользователей, чтобы gr asp? В настоящее время они все делают правильно с точки зрения написанного кода, чтобы перенести черту в область видимости, и все же компилятор ведет себя так, как будто черта отсутствует - тогда как в действительности это несоответствие версии. Можем ли мы применить более явную ошибку на сайте библиотеки?

Подробности, если они имеют значение:

  • Черта BooleanOp является обобщенной c в ее базовый тип с плавающей точкой ( см. реализацию ). Является ли это причиной проблемы, поскольку генерики не создаются, пока код клиента не использует его, как в других языках программирования?
  • Это код клиента воспроизведения: main.rs и Car go .томл .

1 Ответ

1 голос
/ 01 мая 2020

Я суммирую ваш сценарий следующим образом:

  • ваш автомобиль go .toml зависит от geo-booleanop 0.2.1 и geo-types 0.5.0
  • geo-booleanop 0.2.1 зависит от geo-types 0.4.x

Если вы посмотрите на файл Car go .lock, вы заметите, что для geo-types есть две записи [[package]], одна для 0.4.x и один для 0.5.0.

Когда два (переходных) требования зависимости одного и того же проекта несовместимы, car go фактически пытается скомпилировать обоих из них. Car go не предоставляет косвенных зависимостей вашей корзине, поэтому Car go строит обе версии отдельно, как будто они не имеют одинакового имени корзины. Пока вы не пытаетесь использовать geo-types с geo-booleanop, они могут фактически работать независимо.

Для ясности я называю две версии geo_types_04 и geo_types_05 соответственно. geo-booleanop работает с зависимостью, называемой geo_types_04, где geo_types_04 не отображается в вашем ящике, поэтому вам не нужно беспокоиться, если вообще используется geo_types_04.

Он становится только проблема, когда geo-booleanop предоставляет функцию, которая принимает / возвращает некоторый тип, определенный в geo_types_04. Затем вы предполагаете, что это geo_types_05, что приводит к несовместимости.

Ваша ошибка на этот раз на самом деле является одной из наиболее читаемых. Иногда вы получаете ошибки типа Expected geo_types::Line, got geo_types::Line, потому что вызывается функция, принимающая geo_types_04::Line с geo_types_05::Line.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...