Как добавить условные требования rubygem к спецификации gem? - PullRequest
5 голосов
/ 25 октября 2009

Можно ли добавить гем-зависимость, только если человек использует определенную версию ruby?

Справочная информация: Я работаю над форком проекта , который использует Test :: Unit :: Autorunner и тому подобное. Они являются частью стандартной библиотеки в ruby ​​1.8, но не являются частью стандартной библиотеки в 1.9.1, а вместо этого включены в гем "test-unit". Я хочу добавить зависимость, которая говорит, что если кто-то использует ruby ​​1.9.1 или новее, установите гем "test-unit", но если они используют 1.8 или новее, им не нужно ничего устанавливать.

Ответы [ 7 ]

2 голосов
/ 26 октября 2009

Если вы посмотрите документацию gemspec для add_dependency , для версии ruby ​​не будет опции. Возможно, вы могли бы использовать атрибут post_install_message, чтобы указать пользователю установить гем, если он использует ruby ​​1.9.

1 голос
/ 13 апреля 2012

Я сделал именно это для проекта. Хитрость заключается в том, чтобы добавить скрипт в качестве расширения, которое будет выполняться во время установки на компьютере пользователя.

Вот фрагменты кода и ссылки на наш github:

Во-первых, когда в gemspec (мы на самом деле используем Rakefile для его генерации, но результат заканчивается тем же) source

# This file *needs* to be named this, there are other files 
#  for other extension processors
s.extensions << 'ext/mkrf_conf.rb'

А затем соответствующие строки в этом mkrf_conf.rb source

require 'rubygems/dependency_installer.rb' 
inst = Gem::DependencyInstaller.new
inst.install "test-unit" if RUBY_VERSION > "1.9"
1 голос
/ 03 июля 2011

Gem не поддерживает условные зависимости (за исключением среды, в которой находится построитель драгоценных камней - как отмечено выше), и bundler не является приемлемым вариантом для решения этой проблемы - см. https://github.com/carlhuda/bundler/issues/1281

0 голосов
/ 15 декабря 2009

Оформить урок здесь: http://wiki.github.com/rdp/ruby_tutorials_core/gem

показывает, как установить разные версии зависимостей в зависимости от того, какую версию ruby ​​использует установщик.

(короткий ответ - это не так просто, как должно быть)

0 голосов
/ 09 ноября 2009

Gemspecs в любом случае являются просто файлами ruby, так что вы можете выполнить любой код ruby ​​внутри них, поэтому:

spec.add_dependency = 'test-unit', '>= 2.0' if RUBY_VERSION =~ '1.9' 

РЕДАКТИРОВАТЬ: спецификации работают только на машине строителя.

0 голосов
/ 26 октября 2009

Вы не можете. Вам нужно построить два камня, один с

spec.required_ruby_version = '~> 1.8.6'

и один с

spec.required_ruby_version = '~> 1.9.1'
spec.add_dependency 'test-unit', '~> 2.0.5'
0 голосов
/ 25 октября 2009

сено ... я вроде рубинового новичка ... если это лучший способ сделать это.

любым способом ... я хотел бы сделать это, используя только Ruby .... хотя вы можете использовать оболочку операционной системы, чтобы сделать это, используя это в вашей программе установки, просто выполните (работает для операционных систем на основе Linux ):

$ruby --version

(вы можете выполнить это из установочного файла ruby, например: ruby --version) и добавьте возможность в соответствии с выводом, если это 1.9.1, добавьте дополнительную строку для выполнения:

$ sudo gem install gem_name

иначе, просто оставь это.

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