Rubocopを、Ruby 1.9.2系でも使う (rubocop192のご紹介) #rubyjp
ロボコップ 1987 のことではありません。 rubocop192 です。
rubocop192 とは、rubocop を Ruby 1.9.2で動作させるためのソフトウェアです。なんでいまさら Ruby 1.9.2 なのかは聞かないでください。 rubocop について簡単に説明しますね。と、思ったけど以下の記事が詳しいのでそちらを確認してくださいませ。
インストールと使い方
rubocop192 を以下のように gem でインストールしたら、あとは rubocop とまったく同じように使うことができます。ただし、コマンド名は rubocop192
ですのでお間違えなく。
$ gem install rubocop192 (rbenvの方はここで $ rbenv rehash をお忘れなく) $ rubocop192 path/to/file
rubocop192の仕組み
Ruby 1.9.2で rubocop が動作しないのは以下のコメントの部分が原因です。
ruby-1.9.2-p320/ext/json/lib/json/common.rb の 24 行目付近より
# Set the JSON parser class _parser_ to be used by JSON. def parser=(parser) # :nodoc: @parser = parser # 以下の処理で const_defined? が定数 JSON::Parser ではなく定数 # ::Parser が定義されているかをチェックしている。定数 ::Parser は定 # 義されているので true を返す。その結果、remove_const は定数 # JSON::Parser を削除しようとしてしまうのだが、定数 JSON::Parser は # 定義されていないため、ここで例外が発生してしまう。 remove_const :Parser if const_defined? :Parser const_set :Parser, parser end
そこで、 rubocop192 では上記を正しく動作できるように JSON
にモンキーパッチを適用してから本来の rubocop
コマンドの処理を実行するようにしています( 参考:lib/rubocop192.rb )。
と、ここまで書いていて思ったのですが、 rubocop
の gem の設定を確認する限り Ruby 1.9.2 にも対応すべきなので rubocop
自体を修正して Pull Request を送ればよかったですね。→ あとでやる
余談
今回はじめて、開発からRubyGems.orgへの登録までのgem作成に関する一連の作業をWindows上で行ってみました。
途中、
- 何度かEmacsが異常終了したり
- (必ず日本語入力中に異常終了するためIME関連だろうと推測しています)
- Cygwin上で
gem push pkg/rubocop192.gem
ができなかったり - いちいち動作が遅かったり
- gitの操作、Rubyスクリプトの実行など、全体的に遅い
- 作業マシン(Surface Pro)は
Core i5 1.6GHz
なのでマシンのせいではない。OSの問題だと思う
といったことがありましたが、なんとかなりましたね。