Портирование приложения Ruby / Rails / MRI на JRuby - PullRequest
1 голос
/ 18 октября 2011

У меня есть среда разработки Ruby / Rails, использующая rbenv, MRI Ruby (1.9.2-p290), rails 3.0.9 и SQLite3. Я хотел бы перенести его на JRuby, но сделать это так, чтобы мне не нужно было ничего делать, кроме как запустить «rbenv local jruby-1.6.4» и «rails server» в корневом каталоге приложения Rails, чтобы использовать его с JRuby и "rbenv local 1.9.2-p290" и "rails serer", чтобы использовать его с MRI Ruby.

Мне известно, что гемы для доступа к SQLite отличаются для Ruby по сравнению с JRuby, но как вы пишете Gemfile так, что гемы, относящиеся к MRI, выбираются, когда Ruby представляет собой MRI, и выбираются гемы, относящиеся к JRuby? когда Ruby является JRuby?

Мне также нужно будет перенести его на MySQL вместо SQLite. Какие драгоценные камни мне нужно использовать для Ruby и JRuby?

Для записи я использую Ubuntu 11.04, Ruby 1.9.2-p290, JRuby 1.6.4 и Rails 3.0.9 или 3.0.10.

1 Ответ

2 голосов
/ 18 октября 2011

В прошлом году мы портировали большое приложение Rails на JRuby, и это был удивительный объем работы. Конечно, отчасти это связано с тем, что приложение написано довольно плохо и содержит много унаследованного кода, но все же. На случай, если вам интересно: большинство наших проблем связано с драгоценными камнями, которые мы использовали, которые иногда зависели, например, от FFI, который не работал должным образом с JRuby в то время. Порт для Рубинуса, который я сделал чуть позже, казался намного менее болезненным, но был заброшен в пользу того, чтобы остаться с МРТ.

Для Gemfile есть опция platform, которую вы можете использовать. Вот пример из документации Bundler:

gem "weakling",   :platforms => :jruby
gem "ruby-debug", :platforms => :mri_18
gem "nokogiri",   :platforms => [:mri_18, :jruby]

Он также имеет блочную форму:

platforms :jruby do
  gem "foo"
end

Любая форма работает хорошо, так как

Все операции с участием групп (установка пакета, Bundler.setup, Bundler.require) ведут себя точно так же, как если бы какие-либо группы не совпадали текущая платформа была явно исключена.

В качестве драгоценного камня для MySQL я бы использовал метко названный mysql, для JRuby, похоже, jdbc-mysql.

...