Собственные расширения возвращаются к чистому Ruby, если не поддерживаются при установке gem

Я разрабатываю гем, который в настоящее время является чистым Ruby, но я также разрабатываю более быстрый вариант C для одной из функций. Эта функция полезна, но иногда медленна, в чистом Ruby. Медлительность будет влиять только на некоторых потенциальных пользователей (зависит от того, какие функции им нужны и как они их используют), поэтому имеет смысл сделать гем доступным из-за постепенного отката к функциям только для Ruby, если он не может скомпилироваться в целевой системе.

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

Я бы ожидалrequire откат во время выполнения, чтобы появиться в главномlib/foo.rb файл просто так:

begin
  require 'foo/foo_extended'
rescue LoadError
  require 'foo/ext_bits_as_pure_ruby'
end

Тем не менее, я не знаю, как заставить установку gem проверить (или попробовать и потерпеть неудачу) поддержку собственных расширений, чтобы гем правильно установил, может ли он собирать 'foo_extended'. Когда я исследовал, как это сделать, я в основном находил обсуждения несколько лет назад, например.http://permalink.gmane.org/gmane.comp.lang.ruby.gems.devel/1479 а такжеhttp://rubyforge.org/pipermail/rubygems-developers/2007-November/003220.html это означает, что рубиновые самоцветы не поддерживают эту функцию. Ничего недавнего, хотя, так что я надеюсь, что кто-то в SO имеет более современные знания?

Моим идеальным решением было бы до обнаружения сборки расширения определить, что целевой Ruby не поддерживает (или, возможно, просто не хочет, на уровне проекта) собственные расширения C. Но также, механизм try / catch будет в порядке, если не слишком грязный.

Возможно ли это, если да, то как? Или совет опубликовать два варианта драгоценных камней (например,foo а такжеfoo_ruby), что я нахожу, когда ищу, все еще актуальная лучшая практика?

Ответы на вопрос(3)

Ваш ответ на вопрос