rake gems:install
3 мая 2009, ВоскресеньеВ версию rails 2 была добавлена интересная возможность установки зависимых gem библиотек используя только 1 команду. Для этого Вам необходимо вписать в environment.rb следующие строки, например для установки will_paginate:
config.gem 'mislav-will_paginate', :version => '~> 2.3.8',
:lib => 'will_paginate',
:source => 'http://gems.github.com'
После этого в командной строке нужно набрать rake gems:install. Но не все так просто.
Если у Вас есть rake task в котором Вы, например включаете environment.rb то Вы получите интересное сообщение, примерно такое:
sudo rake gems:install (in /home/cthulhu/development/blog) Missing these required gems: mislav-will_paginate ~> 2.3.8 You're running: ruby 1.8.6.111 at /usr/bin/ruby1.8 rubygems 1.3.2 at /home/cthulhu/.gem/ruby/1.8, /usr/lib/ruby/gems/1.8 Run `rake gems:install` to install the missing gems.
ИМХО это еще хуже чем драйвера для вашего CD на CD.
Существует пара хаков против такого поведения.
Плохой, ИМХО, - подхачить rail. Для этого в файле rails/lib/gems.rake в блоке:
namespace :gems do
task :base do
$gems_rake_task = true
require 'rubygems'
require 'rubygems/gem_runner'
begin
Rake::Task[:environment].invoke
rescue
end
end
...
end
Нужно заменить:
Rake::Task[:environment].invoke
на
begin
Rake::Task[:environment].invoke
rescue
end
Не очень хорошо, так как при этом модифицируется код библиотеки и его нужно будет тягать со своим проектом, а в случае если Вы захотите обновиться и забудете о хаке, у Вас будут очередные проблемы.
Второй вариант, более преемлемый - дописать в environment.rb небольшой хак вида:
if $rails_gem_installer
class Rails::Initializer
def load_application_initializers; end
end
config.gem 'mislav-will_paginate',
:version => '~> 2.3.8', :lib => 'will_paginate',
:source => 'http://gems.github.com'
end
Переменная $rails_gem_installer будет установлена когда Вы будете вызывать рейк таски из семейства установки гемов.
Так вот.
Может кто знает более правильные способы решения этой проблемы?
