gem ruby что такое

Библиотеки

Как и в большинстве языков программирования, в Ruby можно использовать широкий набор сторонних библиотек.

Давайте взглянем на поиск библиотек и установку их для дальнейшего использования.

Поиск библиотек

Также есть и другие источники библиотек. RubyForge был популярным домом для библиотек Ruby, но в последний год возросла популярность GitHub, как одного из главных хранилищ исходного кода приложений околорубиевой тематики. Намного чаще сейчас исходный код гема размещен на GitHub и сам гем опубликован на RubyGems.org.

The Ruby Toolbox это проект, который позволяет легче исследовать проекты на Ruby с открытым исходным кодом. Там есть категории для различных проблем разработки, содержащие большое количество информации о проектах, вроде даты релиза и активности разработчиков, а также зависимости и рейтинг проекта, основанный на его популярности на RubyGems.org и GitHub.com. Поиск поможет быстрей найти то, что вы ищете.

Еще пару слов о RubyGems

Это был краткий обзор команды gem для вашего повседневного использования. Более подробная документация также доступна, она покрывает все аспекты данной пакетной системы.

Поиск среди доступных гемов

Команда search может быть использована для поиска гемов по названию. Гемы, название которых начинаются с заданной строки, будут отображены в результатах. Например, чтобы найти гемы, относящиеся к “html”:

Установка гема

Когда вы знаете, какой гем вы желаете установить, например, популярные Rails:

Список всех гемов

Для просмотра всех локально установленных гемов:

Чтобы получить (очень длинный) список всех гемов, доступных на RubyGems.org:

Документация

Документация доступна в вашем терминале:

Источник

Знакомство с Gem. Часть первая

Доброго времени суток!

Введение

Каждый рубист, да и вообще программист, рано или поздно начинает задумываться о написании своих библиотек. Ему начинает надоедать перетаскивание одних и тех же кусков кода в другие проекты. В Ruby лекарством от данного заболевания являются gem‘ы. Итак, давайте познакомимся с ним поближе.

С чего начать

Для начала неплохо было бы отыскать запылившийся файлик с расширением .rb. Нашли? Ok, двигаемся дальше.
Далее нам необходимо создать файл с названием hello-world.gemspec, где, как вы, вероятно, догадались hello-world — имя вашего будущего gem’a.
Следующим нашим шагом будет заполнение этого самого файла (если так можно выразиться, файла-спецификации). Содержание его должно выглядеть следующим образом:

Отлично, но собирать то нам пока нечего! Почему? Мы забыли создать helloworld.rb. Давайте немедленно исправим нашу оплошность:

Фуууух! Теперь, когда мы имеем минимальный набор файлов, мы можем приступить к сборке нашего с вами gem’a. Для его сборки мы должны использовать команду

В случае удачного выполнения данной операции на выходе мы получим файл с название hello-world-1.0.gem. Всё, наш gem собран.

Постойте-ка

Вы хотите поделиться своим gem’ом с другими людьми? Если да, то вы запросто можете это сделать следующей командой:

После выполнения этой команды мы должны увидеть следующее:

Увы, мы этого не увидим. Знаете почему? Потому, что мы с вами ещё не зарегистрированы на RubyGems. Сделать это можно здесь.
Теперь повторите команду push и всё будет ok.

All over the world

Теперь наш gem сможет установить любой рубист (хоть из Австралии), выполнив команду

После того, как установка будет завершена напишем следующий код и выполним его:

В результате чего мы увидим заветное в нашей консоли.

Стопэ!

Вообще-то мы наследили на RubyGems. Вы же об этом не забыли? Удалим наш gem следующей командой:

Да и из нашего списка gem’ов можно удалить. Поигрались и хватит!

Заключение

Вот и сказочке конец, а кто слушал — молодец.
Сегодня мы с вами познакомились с поистине замечательным инструментом по имени gem. Теперь вы знаете, что если что-то случиться, gem обязательно придёт к вам на помощь. А Чип, Чип, Чип… И Дейл к нам спешат.

Источник

Ruby и

сложность материала: для начинающих

необходимые знания : вызов методов, метод require, public и private методы, консоль irb

Послемыслия и работа над ошибками

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

Всё, что вам нужно знать о gem’ах

Минутка лингвистики

«Gem» переводится с английского как «драгоценный камень». Дав формату такое название, авторы недвусмысленно указали на связь с рубином (Ruby — рубин). Произносится он как «джем» [ʤem], хотя в русскоговорящем сообществе нередко можно услышать «гем». Чтобы никого не смущать, я буду использовать оригинальное написание этого слова, т. е. gem.

История

С инициативой стандартного формата для распространения библиотек, написанных на Ruby или C (т. н. расширений), в 2001 году выступил Райан Ливенгуд (Ryan Leavengood), он же является автором первой версии системы управления пакетами Rubygems.

Тем не менее, проект не пошел в массы, до тех пор пока в 2003 году Рич Килмер (Rich Kilmer), Чад Фаулер (Chad Fowler), Девид Блек (David Black), Пол Бреннан (Paul Brannan) и Джим Вайрих (Jim Weirich) не написали свою версию системы управления пакетами. Название ей, с разрешения Ливенгуда, дали Rubygems, хотя от прежней библиотеки в ней не было ни строчки.

Проект продолжает развиваться (в последнее время, не без скандалов) и для официальной реализации Ruby, начиная с версии 1.9, является системной библиотекой (т. е. не требует явного подключения с помощью require ).

Официальная реализация Ruby написана на C.

Что такое gem?

Релизом обычно считают момент присвоения библиотеке нового номера версии (version bump) с одновременной сборкой и публикацией gem’а.

В спецификации содержится достаточно много информации, но самое главное:

Репозиторий

Никто не может вам запретить собрать свой gem, выложить на файлообменнике и дать пользователям ссылку на скачивание. Gem’ы действительно можно устанавливать локально из файлов, но если бы все так поступали, то — снова здравствуй, 2001 год и ненавистная рутинная работа.

К счастью, система Rubygems подразумевает наличие как минимум одного централизованного, доступного 24 часа в сутки, хранилища gem’ов. Благодаря этому утилита gem может не только выполнить установку, запросив в репозитории одно лишь название gem’а, но и тут же автоматически доустановить все отсутствующие зависимости, исходя из спецификации.

Исполняемый файл gem входит в поставку клиентской части Rubygems.

На момент написания этой статьи gem’ы хранятся на Amazon S3, дирижированием ссылок занимается репозиторий rubygems.org. Все его службы написаны на Ruby.

Как возникают gem’ы?

Любой gem появляется как следствие борьбы с проблемой, с которой пришлось столкнуться разработчику. Например, ему была поставлена задача организовать на сайте генерацию отчетов в формате Microsoft Word XP. Если готовых решений для этого не нашлось или не устроила их реализация, разработчик пишет такой генератор самостоятельно.

Поскольку данная задача является типовой, хорошим тоном считается ее gem’ификация, под которой понимают выделение из общего приложения в отдельный проект кода, отвечающего за эту задачу. Внутри проекта структуру папок и наименования файлов приводят к негласному стандарту, а также создают спецификацию. Чтобы теперь назвать это gem’ом, достаточно упаковать папку с проектом с помощью утилиты gem и отправить на rubygems.org.

Публикация gem’а влечет за собой несколько весьма положительных последствий:

Для того, чтобы другие разработчики могли исправить ошибки не только у себя, но и у автора, исходники gem’а обязательно размещают на Github’е. Часто страница проекта на Гитхабе является и основным источником документации.

Git и Github являются стандартом де-факто для Ruby разработчика.

Как их искать?

К сожалению, формат спецификации gem’а не предусматривает указания его категорий или тегов, поэтому если вы пытаетесь найти gem под конкретные нужды, следует надеятся на то, что автор упомянул ключевые слова в описании. Поиск по описанию можно выполнять как на rubygems.org, так и на Гитхабе (выбрав Ruby в списке языков).

Отдельно стоит упомянуть Ruby Toolbox, где gem’ы рассортированы по категориям и популярности. Новые gem’ы добавляет туда вручную автор сайта, поэтому не стоит рассчитывать при поиске только на этот ресурс.

Версии

Система Rubygems подразумевает, что разработчики придерживаются целесообразной политики назначения номеров версий gem’ов. Так, к сожалению, поступают не все, но понимать, в чем она заключается, нужно. Например, чтобы спать спокойно, когда происходит обновление чужого gem’а.

Номер версии должен состоять из трех чисел, разделенных точками: А.Б.В

Число В увеличивается, когда меняется внутренняя реализация библиотеки с сохранением первоначальной логики. Например, это может быть исправление текущих ошибок, могут появиться/быть убраны private методы. Алгоритм работы может быть переписан так, что библиотека заработает в десять раз быстрее! Но эта реорганизация кода абсолютно прозрачна для текущих пользователей gem’а: ничего по существу не добавилось, ничего у себя исправлять не надо.

Число Б увеличивается (и обнуляет В ), когда добавляется новый функционал. Например, могут появиться новые public методы или текущие могут начать принимать дополнительные аргументы. Обновившиеся до этой версии пользователи могут внести изменения в код своих приложений, чтобы начать использовать новые возможности, но могут ничего не трогать, и всё должно работать, как и раньше.

Число А увеличивается (и обнуляет Б и В ), когда происходят изменения, для которых невозможно обеспечить обратную совместимость. Если перейти на эту версию и ничего не изменить в своем приложении, gem не будет работать или будет работать с ошибками. Такой переход может потребовать переписывания приложения с нуля.

Из всего вышесказанного можно сделать вывод, что после версии 0.9.9 совсем не обязательно должна появиться 1.0.0, вполне ожидаемой будет как раз версия 0.9.10 или 0.10.0.

Установка gem’а под микроскопом

Чтобы хорошо понять проблему подключения gem’ов в приложении, нужно разобраться, в каком виде они хранятся на машине. Для этого давайте проследим, что происходит, когда вы набираете в командной строке

Таким образом, команда gem install не выполняет никаких сверхъестественных операций: она только скачивает и распаковывает. Более того, она никоим образом не взаимодействует с уже установленными gem’ами и не трогает окружение, т. е. эта команда сама по себе безвредна. Но можно ли считать процедуру установки абсолютно безопасной? Да, если речь идет о новых gem’ах, и нет, если подразумевается обновление уже установленных, поскольку это косвенно может привести к конфликтам (об этом, как и о способах решения проблемы — ниже).

Подключение gem’ов

Магический (?) require

Итак, вы понемногу осваиваете работу с gem’ами и решили поэкспериментировать с созданием PDF документов. Для этого хорошо подходит Prawn:

Prawn потянул за собой три зависимости.

На главной странице сайта Prawn есть пример использования этой библиотеки:

Вот так просто, оказывается, подключаются gem’ы.

Для начала давайте вспомним, что require — метод, который загружает в память и выполняет содержимое файла (если он не был загружен ранее). Когда не указан полный путь к файлу (наш случай), Ruby всё равно пытается обнаружить файл. Поскольку физически невозможно во время каждого require просматривать все имеющиеся папки на компьютере, область его поиска ограничена только несколькими.

Дело в том, что Rubygems во время загрузки (а в Ruby 1.9 это происходит автоматически) перезаписывают родной метод require своим.

Уточнение версий

Представьте теперь, что вы написали замечательно работающее приложение, в котором используется Prawn. Через некоторое время gem обновился, и последней версией на сайте значится уже 0.12.0. Дух экспериментаторства умирает только после программиста, поэтому вы решаетесь попробовать новую версию.

По умолчанию активируется самая последняя версия.

Gem — глобальный объект, создаваемый Rubygems после загрузки. loaded_specs — хеш со спецификациями активированных gem’ов.

Как вы успели заметить, методы require и gem обычно записывают в поэтичном стиле (без скобок).

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

> 0.11.1′ — этот оптимистичный сперматозоид (который западные товарищи окрестили twiddlewakka)) является просто сокращенной записью предыдущего выражения. Другими словами: второе, если считать справа, число фиксируется, его менять нельзя.

Когда версия указывается без третьего числа, Rubygems опять фиксируют второе справа число, т. е. первое. Таким образом, вызов метода

делает то же, что и

Если gem был активирован, попытка активации другой версии этого же gem’а приведет к ошибке:

И это разумное решение: менять версии в запущенном приложении бессмысленно и опасно.

Там, где бессильны Rubygems

Было время, когда метод gem вполне справлялся со своими обязанностями. Его использовали во вторых версиях Ruby on Rails, и все были счастливы.

Но росло число публикуемых gem’ов, в том числе тех, которые из-за своей популярности использовались в качестве зависимостей других gem’ов. И нередкой стала ситуация, когда при установке двух gem’ов их зависимости пересекались.

Представьте, что на вашей машине установлен следующий набор:

В зависимостях actionpack и thin фигурирует rack :

Теперь подключим эти gem’ы:

Но что, если порядок подключения будет обратным?

И чем больше на вашей машине установлено различных версий одного и того же gem’а, тем больше вероятность подобных накладок. Но ведь зоопарк разных версий — нормальная практика: на одном сервере могут быть запущены одновременно как приложение, написанное два года назад, так и позавчерашнее, и понятно, что они не будут работать с одинаковыми версиями одного и того же gem’а.

Кроме этой проблемы обязательно стоит упомянуть вопрос запуска исполняемых файлов.

В linux эту переменную можно изменить в файлах /etc/environment и

Именно поэтому Rubygems помещают в одну из «видимых» системе папок (в нашем случае в /usr/local/bin ) свои исполняемые файлы, единственная цель которых — запустить одноименный файл из поставки gem’а.

Важно понимать, что если версия не указана, то всегда будет запущена самая последняя версия исполняемого файла из установленных на компьютере, независимо от того, в каком проекте/папке вы находитесь.

Например, если у вас установлены rake версии 0.8.7 и 0.9.2:

Да, задача запуска файлов определенных версий решена, но мягко говоря, не совсем элегантно (например, вам нужно постоянно помнить, в каком проекте какую версию rake или rails вы используете, да еще и указывать ее в команде).

Bundler

Конечно, по-хорошему всё это надо было исправлять в самих Rubygems. Но что-то у них там не срослось, и начали возникать альтернативные менеджеры gem’ов. Самым популярным на данный момент является Bundler, поскольку он входит в поставку и заведует gem’ами третьих Ruby on Rails.

Кроме Bundler’a есть rip, а также мятежный Rubygems форк SlimGems

Bundler — обычный gem, и перед тем, как использовать, его нужно вначале установить (если вы устанавливали Rails v. 3.x.x, это уже сделано). Кроме этого, в своем приложении вы должны подключить в самом начале

Gemfile — еще один пример DSL, о котором шла речь в статье про блоки.

Метод source задает адрес репозитория — rubygems.org.

Метод gem очень похож на родной Rubygem’овский, но это метод самого Bundler’а.

Версии установленных gem’ов будут соответствовать требованиям Gemfile (ужесточение версий абсолютно такое же, как у Rubygem’овского метода gem ). Если номер версии не указан, будет установлена последняя стабильная версия.

Можно исключить установку gem’ов определенной группы (например, на сервере):

Третье, что дает Bundler — простой и гарантированный доступ к исполняемым файлам нужной версии. Если в Gemfile прописано gem «rails», «3.0.5» и вы находитесь в папке с проектом, то команда bundle exec запускает именно то, что нужно:

Если bundle exec для вас слишком длинно, можно выполнить

Четвертое, что позволяет делать Bundler — установку, минуя репозитории Rubygems, прямо из репозитория Git. Вот так можно использовать самую свежую (на момент запуска bundle install ) версию Rails:

На машине должен быть установлен дистрибутив Git.

Пятое, что можно сделать с помощью Bundler — массовый require одной или нескольких групп gem’ов. Так поступают в Rails:

RVM как альтернатива?

В RVM существует понятие gemset, его стоит расценивать как фальшивое окружение, которое RVM подсовывает Rubygems, выдавая его за системное. Создавая gemset, вы создаете новую папку, в которую можно складывать новые gem’ы, будучи абсолютно уверенным, что они изолированы от ранее установленных.

Если создавать отдельный gemset под каждый проект, изоляция gem’ов означает, что, теоретически, вам не нужно использовать ни родной метод gem Rubygems, ни Bundler для ограничения версий, потому что внутри проекта будет установлена и доступна единственная версия каждого из gem’ов. Аналогично отпадает проблема с исполняемыми файлами.

На практике же отказ от Bundler’а сразу потребует ручной установки одинаковых версий gem’ов на всех машинах: у каждого из разработчиков, на каждом сервере. Любая попытка автоматизировать этот процесс приведет к дублированию функционала Bundler’а.

А уж если использовать Bundler, применение gemset’ов RVM’а будет лишней надстройкой.

Источник

Почти полное руководство по написанию Ruby гемов

gem ruby что такое. Смотреть фото gem ruby что такое. Смотреть картинку gem ruby что такое. Картинка про gem ruby что такое. Фото gem ruby что такое

Доброго времени суток, user.

Не так давно у меня возникла задача сделать прототип для одного проекта. В него входила работа с Facebook Graph API. Поковыряв некоторые гемы, я понял, что они для меня не совсем удобные или же реализуют нужный функционал уж слишком сложно. И тут в моей голове всплыла старая идея о написании своего гема. Загуглив массу запросов по этой теме, не нашел полной информации, тем более на русскоязычных ресурсах. Вот так и возникла идея этой статьи. Руководство названо «почти полным», так как тут освещены не все аспекты, а лишь те, которые минимально необходимы и желательны для начала существования продукта вашего воображения. Прошу под кат!

Начнем с базового (спасибо Википедии):

RubyGems (от англ. gem, gems— драгоценный камень) — система управления пакетами для языка программирования Руби который предоставляет стандартный формат для программ и библиотек Руби (в самодостаточном формате «gems»), инструменты, предназначенные для простого управления установкой «gems», и сервер для их распространения.

NOTE: Прошу учесть, что именно RubyGems, а не RailsGems или RoRGems. Это значит, что гемы пишутся непосредственно на чистом и блестящем Ruby, а то, что помечено как Rails Gem — всего лишь Ruby Gem, но использующий, либо дополняющий Rails (кстати, кто не в курсе, Rails — тоже Ruby Gem).

Я использую для разработки IDE от JetBrains — RubyMine (v6.3). В основном из-за удобного autocomplete и интеграции с Git, SFTP и других плюшек. Поэтому все махинации буду показывать именно в этой IDE. Для приверженцев Sublime/Vim/Emacs + Terminal есть куча инструкций по генерации gem-темплейтов через консоль.

Я являюсь создателем, пускай пока сыроватого, но функционирующего гема Fobos (current v0.0.6). Все познания я взял из процесса его разработки.

Шаг 1: Создание болванки

В RubyMine это выглядит как создание нового проекта, но с выбором Poject Type: Ruby Gem.

gem ruby что такое. Смотреть фото gem ruby что такое. Смотреть картинку gem ruby что такое. Картинка про gem ruby что такое. Фото gem ruby что такое

Далее будет выбор версии Ruby. Что, в принципе, ясно и не требует объяснения.

В итоге получаем проект с такой структурой (я убрал галочки для создания bin и test директорий).

gem ruby что такое. Смотреть фото gem ruby что такое. Смотреть картинку gem ruby что такое. Картинка про gem ruby что такое. Фото gem ruby что такое

Рассмотрим по порядку всю структуру.

Шаг 2: создание структуры для работы приложения

Теперь будем работать непосредственно с директорией lib.
Файл SomeCoolGem.rb является стартовым. По идее в нем должна храниться вся логика, но, как показывает практика, гораздо целесообразней создать модуль и разделить приложение на классы по функциональности, а затем просто подгружать их в этот файл. Для тех, кто знаком с языками C++/Java/C# — этот файл чем-то сродним методу main().

Сразу создадим модуль HelloWorld. И в нем создадим сласс Alloha.

Так как весь гем, по сути, есть модуль то уже в файле SomeCoolGem.rb будет следующий код:

Вот так изменилась структура проекта:

gem ruby что такое. Смотреть фото gem ruby что такое. Смотреть картинку gem ruby что такое. Картинка про gem ruby что такое. Фото gem ruby что такое

Шаг 3: Делаем нужный функционал

Добавим в класс Alloha поле, конструктор и какие-нибуль методы для демонстрации:

Шаг 4: Проверяем работоспобность

Так как гем — это модуль, то использовать мы его можем тоже как модуль. Для проверки я обычно использую IRB.

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

Шаг 5: Подключаем все к главному файлу

Для этого нужно немного изменить наш стартовый файл SomeCoolGem.rb:

Теперь при указании нашего гема в Gemfile приложения мы сможем использовать его как обычный модуль Ruby.

Шаг 6: Сборка гема и его версионизация

В файле version.rb хранится текущая версия нашего гема:

Перед каждым релизом нужно будет менять это значение.

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

Чтобы собрать версию гема, вам нужно выполнить команду:

В корне проекта появится файл SomeCoolGem-0.0.1.gem.

Поздравляю. Первая версия гема собрана!

Шаг 7: Пушим гем

Подробная и свежая инструкция всегда лежит здесь.

Так же поный набор инструкций находится здесь.

Там все хорошо и подробно описано.

Шаг 8: Просветление

Теперь я бы хотел поговорить о некоторых плюшках, которые многим интересны.

1. Можно проапдейтить профиль гема на RubyGems. Там есть настройки, в которых можно добавить описание, линки и прочее.
2. Бейджи. Бейджи заслуживают отдельной небольшой темы. Но в двух словах — это обычные картинки, которые вы вешаются в ваш README файл. Они отображают статус пройденных тестов на различных сервисах. Например, проверка чистоты кода. Более подробно можно прочитать здесь.
3. README файл вы должны составлять сами. Старайтесь указывать, какие версии с какими совместимы или нет. Если были сделаны глобальные изменения или закрыта часть старого функционала, меняйте не минорную версию, а постарше, в зависимости от глобальности изменений.
4. Описывайте качественную документацию. Зачастую именно от нее зависит желание использовать вашу наработку или нет.
5. Старайтесь реализовывать функционал с минимальными зависимостями от других гемов и следите за тем, чтобы использовать новые версии в своих наработках.

На этом, пожалуй, все. Удачи всем тем, кто начинает свой путь в этом направлении. Буду рад критике и уточнениям.

UPD:
Уделяйте больше времени файлам *.gemspec и README.

Для редактирования *.gemspec файла можно почитать статью вот здесь

Так же учтите, что все гемы, которые вы используете в своем приложении должны быть указаны тоже в файле *.gemspec

Источник

Как работают gems в rails?

Этим вопросом, хочу понять, что такое гемы и как они работают.
Например, в rails проекте есть Gemfile, в котором есть строка

Далее мы запускаем команду установки bundle и наш проект чудом начинает понимать bootstrap классы.
Так вот, чтобы этого чуда не было, помогите, пожалуйста, здраво сформировать картину, как это работает? Как работают гемы, как фреймворк подключился к проекту и что, в свою очередь, делает bundle?

Вопрос глупый, но когда у тебя нет представления о совокупности разных инструментов, делающих одно дело, это кажется трудным для восприятия.

Оценить 2 комментария

gem ruby что такое. Смотреть фото gem ruby что такое. Смотреть картинку gem ruby что такое. Картинка про gem ruby что такое. Фото gem ruby что такое

gem ruby что такое. Смотреть фото gem ruby что такое. Смотреть картинку gem ruby что такое. Картинка про gem ruby что такое. Фото gem ruby что такое

gem ruby что такое. Смотреть фото gem ruby что такое. Смотреть картинку gem ruby что такое. Картинка про gem ruby что такое. Фото gem ruby что такое

Про Gem:
Gem это есмъ библиотека, скомпанованная определённым образом. То есть это набор кода (модули, классы и тд), которые решают некоторую задачу.
Утилита gem занимается тем, что управляет этими библиотеками. Например ‘gem install colorize’ скачает с интернета библиотеку (далее «гем») в каталог, доступный для твоих программ (конкретное место зависит от настроек и способа установки Рубина). После чего ты сможешь в своём коде написать require ‘colorize’ и пользоваться методами, которые данный гем предоставляет. Гем может требовать для установки другие гемы.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *