Rails 3 и замороженные джемы

Автор — Дмитрий Лихачёв, дата — 30.04.2010

3-и рельсы из-коробки работают с замечательной штукой – bundler, с которой многие костыли для поддержки замороженных джемов становятся ненужными.

Rubygems 1.3.6

Для работы bundler и rails 3 нужны rubygems версии 1.3.6. В Gentoo проблема решается достаточно просто:

# echo =dev-ruby/rubygems-1.3.6 >> /etc/portage/package.keywords/ruby
# emerge rubygems

Потом начинаются грабли :( – все операции gem install начинают плеваться такой фигнёй

$ gem install bundler
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions into the /usr/lib64/ruby/gems/1.8 directory.

Решается просто:

$ echo "export GEM_HOME=~/.gem" >> ~/.bashrc && source ~/.bashrc

И еще один момент – обновленный рубиджемс использует новую схему хранения, посему чтоб исполняемые файлы установленных локально джемов были доступны мутим по аналогии:

$ echo 'export PATH="${PATH}:${GEM_HOME}/bin"' >> ~/.bashrc && source ~/.bashrc

Rails 3

Устанавливаем Rails 3

$ gem install rails --pre

Сгенерируем приложение и перейдём в него

$ rails app
$ cd app

Установка gem’ов

Предположим, что нам понадобился компас

$ echo "gem 'compass', '0.10.0.rc4'" >> Gemfile

Мы хотим, чтобы джемы были заморожены в приложение (чтобы было меньше проблем с deployment), поэтому сделаем так

$ bundle install .bundle/gems
$ bundle pack

после этого джемы будут установлены в папку .bundle/gems

Git’изация

немного седо-магии

$ sed -i 's|.bundle|.bundle/gems|g' .gitignore
$ sed -i '1i .bundle/environment.rb' .gitignore

$ git init && git add . && git commit -am 'initial commit'

Применение

В итоге у нас есть приложение в котором есть всё для вкусной и сладкой жизни.
Чтобы воспользоваться всеми прелестями нам нужен только bundler gem в системе

Бонусы

Development

$ rm ~/.gem -rf

Несмотря на это приложение будет рабочим, подтверждением чего служит успешный запуск

$ script/rails s
=> Booting WEBrick
=> Rails 3.0.0.beta3 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-04-29 16:29:10] INFO WEBrick 1.3.1
[2010-04-29 16:29:10] INFO ruby 1.8.7 (2010-01-10) [x86_64-linux]
[2010-04-29 16:29:10] INFO WEBrick::HTTPServer#start: pid=16514 port=3000

Deployment

$ git clone ...gitrepo..../app.git
$ cd app
$ bundle install # вот здесь и происходит самое вкусное - джемы берутся из vendor/cache и распаковываются в папочку .bungle/gems, попутно компилятся бинарные джемы

Таким образом, мы с минимальными усилиями можем развернуть приложение практически в любом окружении.

Выполнение команд из вмороженных джемов

Если мы хотим воспользоваться, например, командой compass, то можно выполнить её вот так:

$ bundle exec compass

ЗЫ: спасибо jenkek’у за pair writing :)
ЗЗЫ: тема пассажира и руби 1.9 пока не раскурена

Метки: , , ,

В разделах: Из жизни команды

Leave a Reply