Что рекомендуется при создании драгоценного камня для ограничения версий зависимостей. Например, я знаю, что мой гем работает с rubyzip версии 2.x, но я также знаю, что он работает и с 1.9. Должен ли я заявить
spec.add_runtime_dependency 'rubyzip', '>1.8'
или если версия rubyzip 1.9 давно устарела, чаще всего «подталкивают» изменения для строки 2.x? Также, если я использую упомянутую строку, то я рискую несовместимостью с будущими версиями, но, с другой стороны, оставляю выбор пользователю.
Примечание: вопросы общие, и зависимость от rubyzip является лишь примером.
Что касается закрытых голосов - я прошу лучшие практики, которые обычно содержат не только мнения, но и такие аргументы, как безопасность, "наименее неожиданно", удобство использования. Этот квест также ценен еще и тем, что ответ НЕ содержится ни в одной существующей документации (мне известно об этом).
Если вы знаете, что ваш гем работает с rubyzip 1.9
, то сила людям действительно не нужно использовать >=2.0
с ним.
Конечно, обновление зависимостей было бы хорошей идеей для вашего пользователя библиотеки, но это не работа твой, чтобы быть "обновляющим-вашим-программным-политиком"!
Указание версии должно быть < 3
, как правило, рекомендуется (хотя это не всегда делается разработчиками), поскольку существует разумный риск того, что изменение версии основной зависимости будет несовместимо с этой версией вашего кода.
Итак, в качестве компромисса вы можете сделать:
spec.add_runtime_dependency 'rubyzip', '>=1.9', '<3'
См. документация для допустимых примеров синтаксиса.
Я знаю возможный синтаксис, вопрос был больше о том, является ли это рекомендуемой стратегией. Рекомендуется ли оставлять зависимости как можно более широкими?
Я уже ответил на это. Нет, как правило, лучше установить верхнюю границу по крайней мере для основной версии. В противном случае может быть мучительно трудно отследить причину ошибок при обновлении большого количества зависимостей в проекте.
Например, посмотрите на спецификация драгоценных камней для bundler
; самая загружаемая рубиновая жемчужина. Некоторые зависимости (намеренно) еще более строгие, но ни одна из них не имеет верхней границы.
Есть исключения; используйте свое собственное лучшее суждение.
Я не согласен. Я бы сказал, что вы должны оставлять зависимости как можно более широкими. Я не вижу никакой пользы в том, чтобы говорить людям не использовать гем только потому, что вы не могли протестировать гем в сравнении с этой будущей версией в прошлом. Если нет никакой подсказки, что будущая версия может сломать ваш драгоценный камень, тогда будьте слишком строги.
@spickermann Я понимаю, что это несколько самоуверенный ответ (и поэтому, возможно, он не подходит для SO!), Но в мою защиту на сайте rubygems написано: «Важное примечание, которое нужно взять домой, — знать, что другие будут использовать ваши драгоценные камни, поэтому защитите себя от потенциальных ошибок / сбоев в будущих выпусках, используя ~>
вместо >=
, если это вообще возможно». - и я думаю, что веб-сайт rubygems ближе всего подходит к рекомендациям «рекомендуемой практики».
Rake — отличный пример, демонстрирующий использование ~>, что я и вижу в большинстве случаев. Однако он также использует rake ~> 12.0, что несколько спорно - до недавнего времени я использовал 10.5 (стабильная версия Debian), и я сомневаюсь, что они несовместимы по крайней мере с версией 11.0. Итак, судя по вашему ответу, они, вероятно, должны были использовать `">=10.0", "<13.0". Я прав?
@gorn "Я сомневаюсь, что они несовместимы..." - Если они не несовместимы, то да, на мой взгляд, это был бы более «дружественный к сообществу» дизайн. Но я не знаю, верно ли ваше предположение о совместимости.
На самом деле, @gorn, я из интереса быстро обвинил мерзавца и, конечно же: Есть веская причина, по которой это ограничение было добавлено. Rake v10/v11 несовместим (шумные предупреждения об устаревании) с ruby 2.7, поэтому они подняли требования в основной ветке.
Ну, это для более широкого обсуждения «матрицы совместимости», потому что я пытаюсь также поддерживать 1.9 рубинов и т. д. Однако, спасибо за вашу помощь, я буду использовать это. Надеюсь, данное мнение также является передовой практикой ...
Как насчет
'>=1.9', '<3'