Pull to refresh

Пишем свой первый gem

Ruby
Sandbox
Хочу рассказать Вам свой опыт написания gem. Данная идея возникала у меня давно, но до реализации все никак не доходила. Все упиралась в банальную лень и отсутствие достаточной мотивации. Однако неделю назад мне достался проект, связанный с сервером рассылки писем.

Выбираем генератор

На первом этапе нужно было определиться с тем, как будет создаваться библиотека: с нуля или с помощью какого-то генератора. Для первого раза, на мой взгляд, писать с нуля будет достаточно сложно и долго, поэтому рассмотрим известные генераторы. Небольшой поиск показал такие gems: hoe, newgem, bundler. Лично мне понравились два – newgem и bundler. Первый представляет полный комплект шаблонов, охватывающий множество случаев. Но я выбрал bundler за его простоту, минимальный набор сгенерированных файлов и набор rake tasks для создания пакета и его дальнейшей публикации.

Что внутри

Итак, для создания шаблона выполним в терминале команду:

bundle gem foogem

Данная команда создаст каталог foogem, в котором будет папка lib и файлы gemfile, Rakefile и foogem.gemspec. Рассмотрим каждый по отдельности. Файл gemfile, как и в любом bundle совместимом framework, содержит все необходимые gems. Также там присутствует строка gemspec, которая подгружает объявленные зависимости в файле foofem.gemspec. На многих ресурсах и в самом файле советуют заполнять gemfile, а указывать необходимые gems в .gemspec файле. Там разработчик может указать не только зависимости, необходимые для функционирования кода, но и что нужно на этапе разработки. Для указания глобальной зависимости используется метод add_dependency, для режима разработки — add_development_dependency. Кроме этого файл также хранит в себе информацию о разработчиках, краткое описание и версию библиотеки. В Rakefile мы можем прописать rake tasks, которые необходимы для нормального функционирования

Папка lib является основной частью вашего компонента. Она содержит файл foogem.rb и одноименную папку. В ней лежит файл для задания версии vesion.rb. В файле foogem.rb bundler любезно положил следующий код:

require ‘foogem/version’
module Foogem
#code place here
end


Далее вы воплощаете в жизнь свои идеи.

Проверка написанного

Закончив разрабатывать gem, будет неплохо написать тесты для проверки. Лично я предпочитаю rspec другим средам тестирования. Для этого добавим в foogem.spec зависимость

gem.add_development_dependency ‘rspec’

Далее создадим папку spec, которая будет хранить все наши тесты. Так как все тесты могут включать в себя много зависимостей, то выделим их в отдельный файл spec_helper.rb и будем его подключать. Все ж тесты положим в подкаталоги. Для большей автоматизации добавим следующий rake task:

desc 'Spec all functionality of gem'
task :spec_all do
system("rspec spec/*/")
end


Теперь командой rake spec_all мы запускаем все спеки.

Последним этапом будет публикация нашего gem. Для начала нам нужно создать пару акаунтов(если они отсутствуют) на github и rubygem. После этого создайте пустой репозиторий на github. Добавьте его в remote в вашем локальном git репозитории. И выполните команды:

rake build #создаст gem
rake release #опубликует его на github & rubygems


После этого вы можете его устанавливать через команды

gem install foogem #из удаленного сервера
rake install #из локального хранилища


В будущем для продолжения разработки необходимо будет только изменить версию gem в lib/foogem/version.rb и повторить этап публикации.
Tags:rubygithubrubygemsbundler
Hubs: Ruby
Total votes 38: ↑37 and ↓1+36
Views8.5K

Popular right now

Top of the last 24 hours