Является ли хорошей практикой использование последних версий зависимостей при публикации? - PullRequest
0 голосов
/ 09 мая 2020

Я создаю ящик, в котором используется несколько зависимостей, и для того, чтобы sh опубликовать его, мне пришлось указать версии зависимостей. Я заменил свой dep = "*" на dep = ">=N" на N, являющийся для каждого депа последней версией, которую я мог получить после cargo update.

Должен ли я ослабить / уменьшить требуемые версии?

Как я мог это сделать? Я пытался установить dep = "M", где M - гораздо более низкий номер версии, но cargo продолжает использовать более новый. Есть ли инструмент для определения минимума M, необходимого для сборки и тестирования моего ящика?

1 Ответ

0 голосов
/ 12 мая 2020

Под Поле version , Автомобиль go В книге указано:

Автомобиль go запекается в концепции Semanti c Версии , поэтому убедитесь, что вы следуете некоторым основным c правилам:

  • Прежде чем вы достигнете 1.0.0, все пройдет, но если вы сделаете критические изменения, увеличьте младшую версию. В Rust критические изменения включают добавление полей к структурам или вариантов к перечислениям.
  • После 1.0.0 вносите критические изменения только при увеличении основной версии. Не нарушайте сборку.
  • После версии 1.0.0 не добавляйте новый publi c API (никаких новых pub ничего) в версиях уровня исправлений. Всегда увеличивайте младшую версию, если вы добавляете какие-либо новые pub структуры, черты, поля, типы, функции, методы или что-либо еще.
  • Используйте номера версий с тремя числовыми c частями, например 1.0.0, а чем 1.0.

Если разработчики ваших зависимостей приняли и правильно применили эти правила, то, учитывая конкретную c версию этой зависимости (с которой вы знаете, что ваш ящик будет работать против) , любой последующий выпуск исправлений той же основной версии должен всегда работать - и последующие второстепенные выпуски той же основной версии должны также всегда работать, если основная версия не равна 0.

Поскольку Herman L ссылается на , вы можете указать, что вам нужен последний такой «совместимый» выпуск, используя префикс каретки. Он направил вас к главе книги Автомобиль go, посвященной Указанию зависимостей , в которой объясняется:

Требования к картам

Требования к картам разрешить Совместимые с SemVer обновления до указанной версии. Обновление разрешено, если новый номер версии не изменяет крайний левый ненулевой di git в основной, второстепенной группе исправлений. В этом случае, если мы запустили cargo update -p time, автомобиль go должен обновить нас до версии 0.1.13, если это последняя версия 0.1.z, но не обновит нас до 0.2.0. Если вместо этого мы указали строку версии как ^1.0, автомобиль go должен обновиться до 1.1, если это последняя версия 1.y, но не 2.0. Версия 0.0.x не считается совместимой с какой-либо другой версией.

Вот еще несколько примеров требований к картам и разрешенных с ними версий:

^1.2.3  :=  >=1.2.3, <2.0.0
^1.2    :=  >=1.2.0, <2.0.0
^1      :=  >=1.0.0, <2.0.0
^0.2.3  :=  >=0.2.3, <0.3.0
^0.2    :=  >=0.2.0, <0.3.0
^0.0.3  :=  >=0.0.3, <0.0.4
^0.0    :=  >=0.0.0, <0.1.0
^0      :=  >=0.0.0, <1.0.0

Это соглашение о совместимости отличается от SemVer тем, как обрабатывает версии до 1.0.0. В то время как SemVer утверждает, что до 1.0.0 совместимость отсутствует, Car go считает 0.x.y совместимым с 0.x.z, где y ≥ z и x > 0.

Однако это конечно возможно, что некоторые сопровождающие пакетов могут проигнорировать SemVer и вместо этого принять другую схему управления версиями; может попытаться использовать SemVer, но применит его неправильно; или может непреднамеренно внести критические изменения, не осознавая этого. К счастью, самые популярные ящики довольно активны и содержатся в хорошем состоянии, а подобные проблемы (по моему опыту) относительно редки. Система строгих типов в Rust также обеспечивает некоторую дополнительную защиту, предотвращая даже компиляцию многих таких критических изменений, поэтому они часто обнаруживаются очень рано.

Конечно, все критические изменения должны быть обнаружены вашими интеграционными тестами (которые ваш конвейер сборки всегда обеспечивает проход до публикации sh, верно?). Подобные Dependabot также могут предупреждать вас о зависимостях, которые обновляются после выпуска (например, путем создания PR), что, в свою очередь, может заставить ваш конвейер CI немедленно запустить ваш набор тестов для новой версии зависимостей и сообщить результаты.

Может быть веская причина для принятия другого подхода, но в большинстве случаев приведенное выше будет разумным.

...