Pull to refresh

Делаем gem для RubyGems

Reading time3 min
Views2.7K

Собираем камешки для Ruby


Зачастую бывает так, что таскаешь из проекта в проект какие-то куски кода. Такие куски очень удобно выносить во внешние файлы, модули. Для этого в Ruby существует RubyGems — менеджер приложений и библиотек, оформленных в один файл-пакет — gem. И собрать такой гем, а главное, сделать его доступным для любой машины, подключенной к интернету, оказалось очень просто.



Исходные материалы


Итак, начинается все с кода, который надо собрать в гем. У меня это небольшой класс-обертка для API недавно засветившегося на хабре сервиса микроблоггинга Renoter. Вот он — pastie.org/453300 Как видно, здесь всего один класс, из зависимостей только библиотека JSON.

Все нижеследующие действия я производил в MacOS X 10.5.6, хотя в других ОС вряд-ли будут сильные различия. Также у меня были установлены:
  • Ruby 1.8.6
  • RubyGems 1.3.2
  • Git 1.6.2.2


Начинаем


Первым делом идем и создаем git-репозиторий на GitHub`е. Дело здесь в том, что так мы убиваем несколько зайцев: во-первых, решается проблема дистрибьюции гема, он всегда будет доступен на сервере gems.github.com, как username-gemname. Во-вторых, это отличная и популярная платформа для размещения исходных кодов. И третье, возможно самое вкусное: github умеет самостоятельно собирать ваш гем, и пересобирать в случае обновления. На этом мы остановимся чуть позже. Итак, создаем новый репозиторий, и ставим галочку на пункте «RubyGem» в настройках.

Теперь переходим к файловой структуре.
mkdir renoter
cd renoter
mkdir lib
touch README
touch renoter.gemspec

Примерно так выглядит необходимый минимум. В папку lib копируем файл renoter.rb, содержащий вышеприведенный код. Я уберу из него метод logout, чтобы потом показать обновление гема.


Теперь напишем что-нибудь в README, этот файл будет отображаться на странице проекта в github.
Renoter Gem
--------------------------------

Usage:

require 'renoter'

r = Renoter.new
public_timeline = r.public_timeline # Last 20 statuses

if(r.login('user', 'password'))
r.update_status 'Hello from ruby!'
print 'OK!'
else
print 'Login failed'
end

friends_timeline = r.friends_timeline('5') # Last 5 freinds statuses


For more functionality see documentation.


Переходим к файлу renoter.gemspec. Собственно это и есть один из главных файлов, а именно — это конфигурационный файл, на основании которого будет собираться гем. Я просто прокомментирую свой, за дополнительной документацией можно пойти на оффсайт.

Вот такой получился конфиг. Заметьте, что я включил генерацию документации rdoc, поэтому надо оформить файл renoter.rb. На этом, впринципе, все приготовления заканчиваются, и пора проверять сборку гема. Заходим в консоль, и даем следующие команды:
gem build renoter.gemspec

И если все до этого шага было сделано правильно, мы должны получить собранный gem-файл, с названием renoter-0.0.1.gem. Удаляем полученный gem-файл.

Теперь займемся github`ом. Тут снова все просто: заходим в директорию гема, и командуем:
git init
git add *
git commit -m 'Commit renoter gem, 0.0.1'
git remote add origin git@github.com:cheetah/renoter.git
git push origin master

Github спросит ваш пароль, и получив его послушно закоммитит всю папку. Теперь можно откинуться в кресле, как говорила нам великая операционная система, или заварить чашку кофе. Потребуется около 15 минут, чтобы ваш гем собрался. Когда гем соберется, github сообщит вам по электронной почте и в личные сообщения, и ваш гем появится в этом списке. Теперь можно установить его:
gem sources -a gems.github.com (добавляем сервер, возможно у вас он уже добавлен)
sudo gem install cheetah-renoter

Все, гем установлен вместе со сгенерированной документацией, и его можно использовать.

Обновление


Помните, я говорил, то что github умеет пересобирать гем после обновления? Добавляем в файл renoter.rb метод logout, который я убирал, и убедимся в этом. Так-же нужно поменять версию гема на следующую, меняем в файле renoter.gemspec параметр s.version на 0.0.2 Теперь снова коммит:
git add *
git commit -m 'Commit renoter gem, 0.0.2'
git push

И снова на почту приходит уведомление, о том, что гем пересобран, можно обновляться.
sudo gem update cheetah-renoter


Результат


Хотя в основном я делал все это в целях самообучения, в конце получился вполне рабочий gem.
Исходные коды можно взять здесь — github.com/cheetah/renoter

Материалы по темe




Tags:
Hubs:
+22
Comments17

Articles