Делаем gem для RubyGems

    Собираем камешки для 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




    Поделиться публикацией

    Похожие публикации

    Комментарии 17
      +1
      спасибо, попробую
        +2
        Великий textmate
          0
          Да, его тяжело переоценить
          +1
          Выкладывал гем на rubyforge.org. Давно хочу попробовать гитхаб, все никак руки не доходят.
          Спасибо за статью:)
            +3
            Хорошо бы было в блог Ruby перенести…
              +1
              Спасибо всем кто плюсовал, перенес в Ruby
              0
              «Также» пишется слитно, никаких дефисов с «же» :)
                0
                Да, спасибо, исправил.

                0
                а еще есть newgem.rubyforge.org/
                  –1
                  не хочу показаться занудой, но коменты на русском языке есть мовэтон(% надеюсь, в гит они не попали(%

                  спасибо за статью(;
                    0
                    Так я же для статьи, чтобы нагляднее было :)
                    Из гита, если попали — уберу
                      0
                      это понятно, чтобы понятнее, но ваш код на гитхабе, я уверен, будет полезен не только русскоговорящему программисту(;
                      0
                      На русском пишется «моветон» =)
                        0
                        может быть, я транслитерировал с французского(;
                          0
                          А почему тогда слитно? =)
                            +1
                            а чота со школы осталось, ок, исправляюсь: mauvais ton, лады?(%

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

                  Самое читаемое