- PVSM.RU - https://www.pvsm.ru -
Итак, у нас есть существующее приложение Ruby on Rails, работающее под ruby 1.8.7. Казалось бы, “работает — не трогай”! Однако, переход на ruby 1.9.x для приложения, которое мы планируем развивать и поддерживать в будущем, неизбежен по следующим причинам:
В версии 1.9 введено множество небольших изменений, касающихся поведения локальных переменных, хэшей, символов и др. Единственный (на мой взгляд) эффективный метод удостовериться, что миграция на новую версию пройдет без проблем — иметь достаточное покрытие автоматическими тестами.
Другими словами, если у вас еще не написаны тесты (или их покрытие незначительно) — вам нужно их написать до перехода на новую версию.
Вероятнее всего, вам придется вносить изменения в код — создайте новую ветку в вашей системе контроля версий и работайте в ней.
Для управления версиями Ruby будем использовать Ruby Version Manager (https://rvm.io [4]). Если вы еще не сталкивались с RVM, см. http://habrahabr.ru/post/120504 [5]. Использование RVM никак не повредит вашему уже установленному интерпретатору, и вы всегда сможете откатиться обратно к нему.
Устанавливаем ruby 1.9.3 при помощи RVM:
$ rvm install 1.9.3
Эта команда скачает необходимые исходники и соберет их, что обычно занимает несколько минут. В идеальной ситуации участие пользователя не требуется. Однако, в зависимости от конфигурации вашей ОС, для сборки могут потребоваться dev-версии пакетов (какие именно, скрипт установки сообщит).
После успешной установки выбираем ruby 1.9.3 в качестве интерпретатора:
$ rvm use 1.9.3
Чтобы вернуться к системному интерпретатору, наберите:
$ rvm use system
После обновления ruby необходимо заново установить требуемые приложению гемы при помощи Bundler:
$ cd /path/to/app
$ bundle install
Гемы будут установлены по тому же пути (например, vendor/bundle), но в другую вложенную директорию (ruby/1.9.3/gems вместо ruby/1.8/gems).
Если вы зафиксировали версии гемов в Gemfile, то обратите внимание, что очень старые версии гемов могут быть не совместимы с новым ruby.
После установки ruby 1.9 и необходимых гемов запускаем тесты и оцениваем фронт работ по обновлению кода. Приведу описание пары распространенных проблем.
В ruby 1.9 существенно поменялся принцип работы с кодировкой строк (см. http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/ [6] и http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings [7]). Теперь кодировку файла надо указывать явно в первой строке файла. Например, если вы работаете в UTF-8, то в начало каждого .rb/.rake файла необходимо добавить строку вида:
# encoding: utf-8
Это можно сделать автоматически (например, так: http://leonid.shevtsov.me/ru/rasstanovka-direktivy-encoding-utf-8-dlya-ruby-1-9 [8] или так https://github.com/m-ryan/magic_encoding [9])
Для смены кодировки строк теперь доступны несколько удобных функций (см. http://ruby-doc.org/core-1.9.3/String.html#method-i-encode [10] и др.) — больше нет необходимости использовать Iconv.
Если вы используете Base64, то обратите внимание на то, что вывод Base64.encode64/decode64 — ASCII по-определению, и вам, вероятно, придется его преобразовать в UTF-8:
Base64.decode64(‘SGVsbG8sIHdvcmxkIQ==’).encode(‘UTF-8’)
При выкатке нам будет необходимо обновить как исходный код приложения, так и конфигурацию веб-сервера. Если мы не допускаем даун-тайм в работе, то у нас есть несколько вариантов:
Наслаждаемся полученными результатами.
Автор: whisk
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ruby/7979
Ссылки в тексте:
[1] http://habrahabr.ru/post/139370/): http://habrahabr.ru/post/139370/%29
[2] http://slideshow.rubyforge.org/ruby19.html: http://slideshow.rubyforge.org/ruby19.html
[3] http://www.scribd.com/doc/2589469/Migrating-to-Ruby-19: http://www.scribd.com/doc/2589469/Migrating-to-Ruby-19
[4] https://rvm.io: https://rvm.io
[5] http://habrahabr.ru/post/120504: http://habrahabr.ru/post/120504
[6] http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/: http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/
[7] http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings: http://blog.grayproductions.net/articles/ruby_19s_three_default_encodings
[8] http://leonid.shevtsov.me/ru/rasstanovka-direktivy-encoding-utf-8-dlya-ruby-1-9: http://leonid.shevtsov.me/ru/rasstanovka-direktivy-encoding-utf-8-dlya-ruby-1-9
[9] https://github.com/m-ryan/magic_encoding: https://github.com/m-ryan/magic_encoding
[10] http://ruby-doc.org/core-1.9.3/String.html#method-i-encode: http://ruby-doc.org/core-1.9.3/String.html#method-i-encode
Нажмите здесь для печати.