Как создать gem и опубликовать его
Введение
В процессе работы каждый ruby-разработчик пользуется сторонними библиотеками (так называемые гемы). Не всегда получается найти гем с нужным функционалом, в таких ситуациях приходится писать собственное решение. Чаще всего такие решения не входят за рамки проекта, но иногда разработчики задумываются о том чтобы обернуть свое решение в гем и поделится им с сообществом.
У меня возникла потребность парсить мета-теги на веб-странице. Найденные готовые решения не удовлетворяли меня, потому я написал свой модуль. Для полного счастья не хватало обернуть решение в гем, чем я и занялся. Результаты работы можно посмотреть по ссылке:
Данное руководство написано с целью помочь начинающим разработчикам. Оно является пересказом собственного опыта. Более подробную информацию можно получить на сайте официального руководства http://guides.rubygems.org
Начало работы
Для начала нужно создать новый каталог который будет содержать код с нужным функционалом. Так как решение состоит из одного модуля, его следует положить в папку lib/
В корне проекта создаем Gemfile и прописываем там версию ruby и необходимые зависимости. После этого ставим их через bundle install.
Очень рекомендую написать юнит тесты. Они должны быть в папке test/ или spec/
После того как функционал написан, покрыт тестами и протестирован, начинаем создавать гем. Прописываем стандартный .gitignore и коммитим наш код.
Выкладываем его на github
git remote add origin git@github.com:USER_NAME/REP_NAME.gitgit push -u origin master
Создаем файл с описанием гема GEM_NAME.gemspec куда прописываем всю необходимую информацию включая название, описание, версию, ссылки, зависимости, и файлы.
Пробуем собрать свой гем.
$ gem build meta_information.gemspec
Successfully built RubyGem
Name: meta_information
Version: 1.0.1
File: meta_information-1.0.1.gem
Проверим установку только что собранного гема.
$ gem install ./meta_information-1.0.1.gem
Successfully installed meta_information-1.0.1
Parsing documentation for meta_information-1.0.1
Done installing documentation for meta_information after 0 seconds
1 gem installed
Обязательно проверим работоспособность в консоли.
$ irb
2.3.3 :001 > require 'meta_information'
=> true
2.3.3 :002 > MetaInformation::VERSION
=> "1.0.1"
2.3.3 :006 > MetaInformation.get_meta('https://www.yandex.ru’)
Если все работает, то начинаем заливать гем в публичный доступ. Первым делом авторизовываемся в rubygems.org
$ curl -u USER_NAME https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
Обновляем репозиторий на github
$ git add —all
$ git commit
$ git push origin master
Публикуем гем и проверяем что он доступен
$ gem push meta_information-1.0.1.gem
$ gem list -r meta_information
Если все прошло удачно, то он доступен по прямой ссылке (rubygems.orb/gems/GEM_NAME).
Пример: https://rubygems.org/gems/meta_information
Ура, гем удачно опубликован 🎉 , теперь его можно смело установить следующей командой.
$ gem install meta_information
Дальнейшие обновления гема
Со временем каждый гем развивается, к нему добавляется новый функционал, убираются ошибки, на github появляются issues которые надо решить и pull-requests которые надо мерджит. Все это являются предпосылками к новому релизу. Для того чтобы выложить новый релиз на rubygems, нужно повторять следующие действия.
Обновить .gemspecfile. В нем нужно как минимум обновить версию. После этого снова собрать обновленный гем, проверить установку и работу.
$ gem build meta_information.gemspec
$ gem install ./meta_information-1.0.2.gem
Если все работает то опубликовать новую версию.
$ gem push meta_information-1.0.2.gem
Вот, собственно все. Ниже публикую полезные ссылки с подробной информацией.
Publishing your gem: http://guides.rubygems.org/publishing/
Specification reference: http://guides.rubygems.org/specification-reference/