Хочу рассказать Вам свой опыт написания gem. Данная идея возникала у меня давно, но до реализации все никак не доходила. Все упиралась в банальную лень и отсутствие достаточной мотивации. Однако неделю назад мне достался проект, связанный с сервером рассылки писем.
На первом этапе нужно было определиться с тем, как будет создаваться библиотека: с нуля или с помощью какого-то генератора. Для первого раза, на мой взгляд, писать с нуля будет достаточно сложно и долго, поэтому рассмотрим известные генераторы. Небольшой поиск показал такие gems: hoe, newgem, bundler. Лично мне понравились два – newgem и bundler. Первый представляет полный комплект шаблонов, охватывающий множество случаев. Но я выбрал bundler за его простоту, минимальный набор сгенерированных файлов и набор rake tasks для создания пакета и его дальнейшей публикации.
Итак, для создания шаблона выполним в терминале команду:
Данная команда создаст каталог 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 любезно положил следующий код:
Далее вы воплощаете в жизнь свои идеи.
Закончив разрабатывать gem, будет неплохо написать тесты для проверки. Лично я предпочитаю rspec другим средам тестирования. Для этого добавим в foogem.spec зависимость
Далее создадим папку spec, которая будет хранить все наши тесты. Так как все тесты могут включать в себя много зависимостей, то выделим их в отдельный файл spec_helper.rb и будем его подключать. Все ж тесты положим в подкаталоги. Для большей автоматизации добавим следующий rake task:
Теперь командой
Последним этапом будет публикация нашего gem. Для начала нам нужно создать пару акаунтов(если они отсутствуют) на github и rubygem. После этого создайте пустой репозиторий на github. Добавьте его в remote в вашем локальном git репозитории. И выполните команды:
После этого вы можете его устанавливать через команды
В будущем для продолжения разработки необходимо будет только изменить версию gem в lib/foogem/version.rb и повторить этап публикации.
Выбираем генератор
На первом этапе нужно было определиться с тем, как будет создаваться библиотека: с нуля или с помощью какого-то генератора. Для первого раза, на мой взгляд, писать с нуля будет достаточно сложно и долго, поэтому рассмотрим известные генераторы. Небольшой поиск показал такие 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 и повторить этап публикации.