Переводим Rails–приложение на Ruby 1.9

Итак, у нас есть существующее приложение Ruby on Rails, работающее под ruby 1.8.7. Казалось бы, “работает — не трогай”! Однако, переход на ruby 1.9.x для приложения, которое мы планируем развивать и поддерживать в будущем, неизбежен по следующим причинам:

Перед началом

В версии 1.9 введено множество небольших изменений, касающихся поведения локальных переменных, хэшей, символов и др. Единственный (на мой взгляд) эффективный метод удостоверится, что миграция на новую версию пройдет без проблем — иметь достаточное покрытие автоматическими тестами.

Другими словами, если у вас еще не написаны тесты (или их покрытие незначительно) — вам нужно их написать до перехода на новую версию.

Вероятнее всего, вам придется вносить изменения в код — создайте новую ветку в вашей системе контроля версий и работайте в ней.

RVM

Для управления версиями Ruby будем использовать Ruby Version Manager (https://rvm.io). Если вы еще не сталкивались с RVM, см. http://habrahabr.ru/post/120504. Использование RVM никак не повредит вашему уже установленному интерпретатору, и вы всегда сможете откатиться обратно к нему.

Устанавливаем ruby 1.9.3 при помощи RVM:

$ rvm install 1.9.3

Эта команда скачает необходимые исходники и соберет их, что обычно занимает несколько минут. В идеальной ситуации участие пользователя не требуется. Однако, в зависимости от конфигурации вашей ОС, для сборки могут потребоваться dev-версии пакетов (какие именно, скрипт установки сообщит).

После успешной установки выбираем ruby 1.9.3 в качестве интерпретатора:

$ rvm use 1.9.3

Чтобы вернуться к системному интерпретатору, наберите:

$ rvm use system

Bundler

После обновления ruby необходимо заново установить требуемые приложению гемы при помощи Bundler:

$ cd /path/to/app
$ bundle install

Гемы будут установлены по тому же пути (например, vendor/bundle), но в другую вложенную директорию (ruby/1.9.3/gems вместо ruby/1.8/gems).

Если вы зафиксировали версии гемов в Gemfile, то обратите внимание, что очень старые версии гемов могут быть не совместимы с новым ruby.

Модифицируем код

После установки ruby 1.9 и необходимых гемов запускаем тесты и оцениваем фронт работ по обновлению кода. Приведу описание пары распространенных проблем.

Encoding: utf-8

В ruby 1.9 существенно поменялся принцип работы с кодировкой строк (см. http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/ и http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings). Теперь кодировку файла надо указывать явно в первой строке файла. Например, если вы работаете в UTF-8, то в начало каждого .rb/.rake файла необходимо добавить строку вида:

# encoding: utf-8

Это можно сделать автоматически (например, так: http://leonid.shevtsov.me/ru/rasstanovka-direktivy-encoding-utf-8-dlya-ruby-1-9 или так https://github.com/m-ryan/magic_encoding)

String.encode и др.

Для смены кодировки строк теперь доступны несколько удобных функций (см. http://ruby-doc.org/core-1.9.3/String.html#method-i-encode и др.) — больше нет необходимости использовать Iconv.

Если вы используете Base64, то обратите внимание на то, что вывод Base64.encode64/decode64 — ASCII по-определению, и вам, вероятно, придется его преобразовать в UTF-8:

Base64.decode64(‘SGVsbG8sIHdvcmxkIQ==’).encode(‘UTF-8’)

Deployment

При выкатке нам будет необходимо обновить как исходный код приложения, так и конфигурацию веб-сервера. Если мы не допускаем даун-тайм в работе, то у нас есть несколько вариантов:

  1. Написать полностью обратно-совместимый код, который работает одинаково хорошо под ruby 1.9 и 1.8 и переконфигурировать только веб-сервер;
  2. Поднять обновленный проект на другом IP или порту и после тестирования выполнить прозрачную для пользователя подмену (при помощи обратного прокси или смены DNS).

Готово!

Наслаждаемся полученными результатами.

У нас есть похожие новости по этим темам:
Наверх

1 комментарий