Что именно является родным расширением гема?

Мне кажется, что нативное расширение похоже на библиотеки, которые вы должны установить в свою систему, прежде чем пытаться установить те гемы, которые зависят от нативных расширений. Как и библиотека ImageMagic. Это верно? Есть ли что-то еще, что мы должны знать о собственных расширениях?

12 голосов | спросил Danny Ocean 3 J000000Friday15 2015, 12:01:39

4 ответа


0

Собственное расширение gem может ссылаться на отдельную библиотеку, которую необходимо предварительно установить, и RMagick это пример.

Тем не менее, термин действительно означает «включает в себя некоторый код, который должен быть скомпилирован для вашей машины». Код скомпилирован и скомпонован так, что полученный исполняемый файл может быть require d Ruby на компьютере.

Обычные причины написания расширения для Ruby C или C ++:

  • Скорость. Для некоторых задач, интенсивно использующих процессор, код на C может быть в 100 раз быстрее, чем Ruby. В этом случае собственное расширение может быть полностью автономным со всем исходным кодом C, включенным в гем.

  • Сторонняя библиотека уже написана на C. В этом случае у гема будет исходный код C, который связывает библиотечные функции с модулями, классами и методами Ruby.

Вы можете просмотреть исходный код C для драгоценных камней с собственными расширениями, он устанавливается вместе с исходным кодом Ruby. По соглашению, внутри гема есть папка с именем ext/gem_name, в которой находится файл Ruby extconf.rb, который передает информацию компилятору (технически он создает файл make ). Кроме того, исходные файлы C также находятся там.

MRI Ruby реализована как очень «плоская» структура в C, в основном состоящая из большого числа функций C. Это позволяет относительно легко узнать, как реализовать собственное расширение, даже если вы не очень много знаете C. Вы можете прочитать Расширение Ruby 1.9 в качестве введения в тему.

Собственные расширения могут не устанавливаться или работать неправильно. Существует много вопросов о переполнении стека с просьбой о помощи в определенных неудачных установках. Обычные проблемы:

  • Отсутствующие библиотеки. Надеюсь, автор драгоценных камней объяснит, что вам нужно предварительно установить в README, но не всегда понятно.

  • Несовпадение компилятора. Трудно протестировать все целевые системы, поэтому иногда инструкции в extconf.rb не будут работать в конкретной системе, или код C будет выдавать предупреждения или не компилировать из-за различий. В Windows у вас, вероятно, не будет работающего компилятора, если вы не установите Ruby Devkit

  • Не будет работать со всеми версиями Ruby. Например, JRuby может использовать собственные расширения C, если оно включено, но это не всегда целесообразно - тема довольно сложная, но обычно избегают смешивания JRuby и собственных расширений.

ответил Neil Slater 3 J000000Friday15 2015, 12:16:11
0

Нативное расширение - это просто драгоценный камень, который написан (полностью или частично) на C.

Это может зависеть или не зависеть от внешней библиотеки, здесь это не имеет значения. Важно то, что такой гем нужно скомпилировать и он, вероятно, будет зависеть от платформы (была причина использовать C, верно? Может быть, для использования какого-то низкоуровневого API ОС или чего-то еще. Но чаще всего это связано с библиотека).

ответил Sergio Tulentsev 3 J000000Friday15 2015, 12:12:17
0

Цитировать эту статью

  

«Собственные расширения» - это клей, который связывает гем Ruby с некоторым другим программным компонентом или библиотекой, не относящейся к Ruby, на вашем компьютере.

введите описание изображения здесь

Собственное расширение не является зависимостью. Нативное расширение - это, как правило, код C, который взаимодействует с зависимостью не от Ruby.

Например, гем, использующий ImageMagic, имеет собственное расширение, написанное на C, которое взаимодействует с ImageMagic и представляет собой мост от гема Ruby к ImageMagic.

Когда вы устанавливаете гем, а собственное расширение компилируется, вы не компилируете библиотеку C (например, ImageMagic), эта библиотека должна уже присутствовать в вашей системе. Вы компилируете мост C в комплекте с гемом.

ответил Simone Carletti 3 J000000Friday15 2015, 12:10:37
0

Я не большой специалист по рубину, поэтому возьмите это с крошкой соли:

Я совершенно уверен, что это просто гем, для работы которого нужно установить собственную (например, C-Library) библиотеку. Многие гемы просто оборачивают существующие C-библиотеки с помощью Ruby API.

Установка гема приведет к загрузке C-библиотек, которые затем будут собраны с использованием gcc или другого компилятора. Если конфигурация вашей системы не поддерживается, вам нужно будет передать параметры в инструмент gem, чтобы указать правильные каталоги и т. Д. Если вам не повезло, вам может потребоваться изменить файлы make напрямую.

ответил Frank R. 3 J000000Friday15 2015, 12:06:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132