環境
- Ruby 2.2.3
- Rails 4.2.4
概要
2015/12/23、bundle updateをしてから、gemでbootstrapを入れようと思って作業していたら、railsコマンドでエラーが出るようになった。
1. 問題
railsコマンドを叩くとエラーが発生し、実行できなくなった
$ rails s
.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/less-rails-2.7.0/lib/less/rails/railtie.rb:19:in `block in <class:Railtie>': undefined method `register_preprocessor' for nil:NilClass (NoMethodError)
2. 想定される原因
エラーが出るようになる前に、今回行った作業は下記2点
- bundle update
- 'therubyracer', 'less-rails', 'twitter-bootstrap-rails'をbundle install
bootstrapに関する上記3点のgemを取り除けば、railsコマンドは正常に動くようだ。
3. 原因の特定
2015/12/18にリリースされたばかりのsprockets-rails 3.0.0と、今回インストールしたless-rails-2.7.0との相性が悪いみたい。
4. 対策と問題解決
sprocket-railsをダウングレード
では、順を追って、詳細を書いていきます。
1. 問題
railsコマンドを叩くとエラーが発生し、実行できなくなった
bundle updateを行った後、
bootstrapのインストールをしようとしたらエラーが出た。
$ rails generate bootstrap:install less
.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/less-rails-2.7.0/lib/less/rails/railtie.rb:19:in `block in <class:Railtie>': undefined method `register_preprocessor' for nil:NilClass (NoMethodError)
less-rails-2.7.0/lib/less/rails/railtie.rbの19行目の、register_preprocessorってメソッドがundefinedだよっていうエラー。
Gemfileに追加した記述は、bootstrapインストールのための下記3つ。
gem 'therubyracer'
gem 'less-rails'
gem 'twitter-bootstrap-rails'
ちなみに他のrailsコマンドでもエラーが出る。
$ rails s
.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/less-rails-2.7.0/lib/less/rails/railtie.rb:19:in `block in <class:Railtie>': undefined method `register_preprocessor' for nil:NilClass (NoMethodError)
2. 想定される原因
エラーが出るようになる前に、今回行った作業
- bundle update
- 'therubyracer','less-rails','twitter-bootstrap-rails'をbundle install
bootstrapに関する上記3点のgemを取り除けば、railsコマンドは正常に動くようだ。
3. 原因の特定
いろいろと調べていたところ、どうやら5日前(2015/12/18)あたりにリリースされたばかりのsprockets-rails 3.0.0と、今回インストールしたless-rails-2.7.0との相性が悪いみたい。
[参考]Doesn't work with sprocket-rails v3.0
sprocket-railsのgithubで、5日前(2015/12/18)に下記のコミットログあり。
[github]https://github.com/rails/sprockets-rails
Release 3.0.0
rafaelfranca committed 5 days ago
5日前の2015/12/18にsprockets-rails 3.0.0をリリースしたようだ。
4. 対策と問題解決
sprockets-railsをダウングレード
bundle showをしてみると、sprockets-rails 3.0.0になっていた。
$ bundle show
(略)
* sprockets-rails (3.0.0)
以前のバージョン2.3.3に下げるため、sprocket-railsのダウングレードを実施。
まずは、3.0.0のアンインストール。
$ gem uninstall sprockets-rails
Select gem to uninstall:
1. sprockets-rails-2.3.3
2. sprockets-rails-3.0.0
3. All versions
> 2
Gemefileで、sprocket-railsのバージョン指定。
gem 'sprockets-rails', '2.3.3'
当然だが、bundle updateしないと怒られるので
$ bundle show
You have requested:
sprockets-rails = 2.3.3
The bundle currently has sprockets-rails locked at 3.0.0.
Try running `bundle update sprockets-rails`
bundle udpateを実行。
$ bundle update
これで、railsコマンドが使用できるようになりました。
まだ情報が少ないので取り急ぎですが、以上です。