Javaエンジニアがいまさら始めるRuby開発環境

  • 363
    いいね
  • 0
    コメント

普段Javaを主言語として使っている人が、Rubyを始める時の開発環境構築の記事です。
自分は、2006年ぶりのrubyです。
最近、再び触ろうとしましたが、すべてを忘れていました。(つまり初心者)
なので、試行錯誤して作った環境構築と参考にした記事を記述しています。
(それとJavaでいうところの何なのかをも書きます。)
なお参考にした記事のリンク先を見た方がそれぞれの理解が深まると思います。

mac環境限定です。

構築の前に

構築の前にRuby環境において、Javaでは何なのかを簡単にまとめておきます。
正確には違うけど、大体こんな感じと捉えて下さい。

Ruby Java 概要
rbenv SDKMAN! 複数バージョンの使い分けの仕組み
gem jar ライブラリとしての意味とコマンドとしての意味がある
http://rubygems.org/ http://search.maven.org/ ライブラリのレポジトリ
bundler gradle,maven パッケージ管理ツール
rubocop checkstyle コーディング規約のチェックツール
rubocop -a + Vim設定など formatter ソースフォーマッターツール
RDoc,YARD,TomDoc JavaDoc ドキュメント。RDocが標準
Test::Unit JUnit 単体テストフレームワーク
RSpec Spock(Groovy) BDDフレームワーク

Editorは、人によって大きく違うと思うけど、大体こんな感じだと思います。

  • Rubyでは、Vim,Emacsなどのエディタ + Plugin + 開発支援なgem
  • Javaでは、Eclipse,NetBeans,IntelliJなどのIDE

Javaの人はIDEが無いと辛いと思うかもしれませんが、Vim Pluginや開発支援するgemを使えば、IDEと遜色なく使えるのではないかと思います。
例えば、エディタ上で以下のことはできます。

  • コード補完
  • ブレイクポイントを置いて、ステップ実行
  • カーソル上のクラスやメソッドに飛ぶ(gemやRuby本体のC言語も含む)
  • 知りたいクラスやメソッドなどのドキュメントやソースの表示
  • 保存時にコーディング規約違反の表示

homebrew

mac標準のrubyでまずはhomebrewをインストールします。

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

ruby開発環境に関係するものを Brewfile brewfile.sh に記述します。
(Brewfileは使えなくなったので書き換えました)

brewfile.sh
brew install git

brew install lua
brew install ctags

## ruby
brew install readline
brew install ruby-build
brew install rbenv
brew install rbenv-gemset

## Editor
brew install vim --with-lua
・・・

上記Brewfile brewfile.shのあるディレクトリで以下を実行してインストールします。

$ chmod +x brewfile.sh
$ ./brewfile.sh

rbenv

Ruby環境のバージョン切り替えツールです。
JavaでいうところのSDKMAN!になります。
Javaでは環境変数 JAVA_HOME を手動で書き換えてたあれです。Rubyでは仕組みとして用意されています。

まずはパスを通しておきます。

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
  • rbenv-default-gemsの利用

これは、どのバージョンのrubyでも共通に利用したいgemがある場合やプロジェクト内でバージョンを合わせたい場合にも役立ちます。
(ここでいうgemはjavaでいうところのjarです。)

まずは、インストール

$ git clone https://github.com/sstephenson/rbenv-default-gems.git ~/.rbenv/plugins/rbenv-default-gems

以下のファイルにrbenv install後に一緒に gem install したいgemを指定します。

~/.rbenv/default-gems
bundler ~>1.7.0
pry
pry-doc
pry-stack_explorer
pry-byebug
refe2
rubocop
  • ruby本体のインストールと設定

インストール可能なrubyバージョンを調べてインストールします。

$ rbenv install -l
・・・
$ rbenv install バージョン番号

インストールしたら ~/.rbenv/versions/バージョン番号/bin/ の実行ファイルを動作するシェルスクリプトを ~/.rbenv/shims に置くためのコマンドを打ちます。

$ rbenv rehash

普段利用するバージョンを設定します。

$ rbenv global バージョン番号

以下は必要なときにやります。
特定のディレクトリで利用するバージョンを設定します。

$ rbenv local バージョン番号

使わないバージョンは削除の仕方です。

$ rbenv uninstall バージョン番号

一応、rbenv-default-gemsで指定したアプリを見ます。

$ gem list

参考

rbenvは以下の記事を参考にしました。
rbenvでRubyのバージョンを指定する方法

Bundler

gemコマンドがシステムで利用するgemのパッケージ管理ツールで、Bundlerはアプリ毎のgem(とそのバージョン)管理ツールという理解です。
(Bundlerは、Javaでいうところのmavenやgradle)

インストールは、上記での rbenv-default-gemsを利用したので済んでいます。

管理したいgemをGemfileに記述します。

$ bundle init

上記コマンドで以下のGemfileができます。
(Gemfileは、Javaでいうところのpom.xmlやbuild.gradle)

# A sample Gemfile
source "https://rubygems.org"

# gem "rails"

例えば、Gemfileに以下を追加して

gem 'rspec', '~> 3.0.0'
gem 'pry'
gem 'pry-doc'
gem 'pry-stack_explorer'
gem 'pry-byebug'

インストールする。

$ bundle install --path vendor/bundle 

--path によってgemが置かれる場所を指定できます。
これにより、プロジェクト毎に違うgemを利用することができます。
なお、一度 --path 付きでインストールすると次からも同じ場所にインストールされます。

--path でインストールすると以下のコマンドでrspecが表示されません。

$ gem list

この場合は、bundle exec を付けることで、インストールしたディレクトリを解決してコマンドを実行してくれます。

プログラム内では、以下のように記述するとgemを一括でrequireされます。

require 'bundler'
Bundler.require

参考

rbenvからbundlerまでは以下の記事を参考にしました。
Rails開発環境の構築(rbenvでRuby導入からBundler、Rails導入まで)
Bundler再履修: bundle execって何? gemはどこに入るの?
https://gist.github.com/kozy4324/5719555

Editor

自分はエディタにvimを使っています。
(Javaでは、EclipseなどのIDEを使いますが、Rubyでは軽量なエディタにpluginなどでIDE的な機能を追加していくことが多いようです)

rubyの入力を補完させたいのでneocompleteプラグインを使います。
これはluaなvimでないと動きません。
まずは、対応vimかを確認します。

$ vim --version | grep lua
+lua

+luaが表示されない場合は、こちらのブログを参照して下さい。

またhomebrewのvimは現在+rubyになっています。一応確認します。

$ vim --version | grep ruby
+ruby

次に、vimプラグインを簡単に管理したいので、NeoBundleを入れます。

$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh | sh

.vimrc を記述します。

自分の場合はgithubで管理しています。一応、自分のをリンクしますが、これよりも他の方々のを参考にしたほうがいいと思います。
Neobundle用のvimrc
ruby用のvimrc

ここでvimを開くとneocompleteなどの記述したpluginがインストールされます。

vim pluginやgemなど

neocomplete

自動でコード補完をするプラグインです。

vimでは標準で補完機能があります。インサートモードで <Ctrl-x> で表示されます。例えば、その後<Ctrl-o> をするとオムニ補完されます。

この <Ctrl-x> をしなくても補完が出るようにするためにneocomplete利用します。

以下が自分の .vimrc になります。
Neocomplete用のvimrc

Refe2

コマンドラインから日本語リファレンスを引くために利用します。

rbenv-default-gems でインストール済(依存するbitclustも同様)なので、
まずはリファレンスのデータベースを作成する。

$ bitclust setup --versions=2.1.2

この操作で、~/.bitclust以下にドキュメントをダウンロードしてデータベースを作成しているようです。
更新も同様のコマンドです。

これでターミナルでドキュメントを見れますが、vim上で読みたいので、vim-ref-riを使います。

vim-ref-ri

vimで以下のコマンドを打つとRefeのドキュメントが見れます。

: Ref refe Array

以下はriでドキュメントが見れます。

: Ref ri Array

Uniteプラグインを使っていれば、以下で出来ます。

: Unite ref/refe

enter でカーソルのリファレンスが見れて、<Ctrl-o> で戻る。<Ctrl-i> で進む。
また、vim上のソースにカーソルを合わせて、 <Shift-k>を入力すると 定義が見れます。

参考

refeは以下を参考にしました。
vim-refとReFeでRubyのリファレンスマニュアルをvimで読む

ctags

ソースにインデックスを付けて、エディタで参照をするために利用します。

インストールは、homebrewで済んでいます。

rubyの定数も対象にするために以下を作成しておきます。

~/.ctags
--regex-ruby=/^[\t ]*([A-Z][-_A-Za-z0-9]*::)*([A-Z][-_A-Za-z0-9]*)[\t ]*=/\2/C,constant/

そしてインデックスを作ります。
rubyプロジェクトのルートで以下のようなコマンドを叩きます。

$ ctags --languages=ruby -R .

ctagsディレクトリが出来ます。

これでインデックスされたソースは、vim上で、<Ctrl-]>でその定義のソースに飛びます。<Ctrl-o> で戻ります。

参考

ctagsやrefは以下の記事を参考にしました。
Rubyのコードを読むのが捗る技 (Vim)
Rubyの定数をTag Jumpできるようにする

pry,pry-doc,pry-stack_explorer,pry-byebug

主にソースにブレイクポイントを貼ってデバッグするために利用します。

pry自体はirbのパワーアップ版みたいなツールです。
pry-docはRuby本体のC言語を参照できるようにするツールです。
pry-stack_exploreは、pryで止めた場所までの呼び出しメソッドのスタックを扱えるツールです。
pry-byebugはpryでステップ実行をできるようにするツールです。Ruby2.0.0以前の場合は、pry-debuggerを利用します。

インストールは、bundler で済んでいます。

例えば以下のように binding.pry と書き、

hello.rb
require 'pry'
class Hello
    def message
        @hoge = 'hoge'
        binding.pry
        @hoge = 'hello'
    end
end
Hello.new.message

実行させます。

$ ruby hello.rb

するとbinding.pry のところでpryが起動します。

    3: def message
    4:     @hoge = 'hoge'
    5:     binding.pry
 => 6:     @hoge = 'hello'
    7: end

下記のようにデバッグできます。
ls でオブジェクトの状態を見て、cd 変数名 でそのオブジェクト内に入ります。

[1] pry(#<Hello>)> p @hoge
'hoge'
=> 'hoge'
[2] pry(#<Hello>)> ls
Hello#methods: message
instance variables: @hoge
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_
[3] pry(#<Hello>)> cd @hoge
[4] pry('hoge'):1> upcase
=> 'HOGE'
[5] pry('hoge'):1>

show-stack でスタック一覧が表示されて、up で上位スタック、dowon で下位スタックへ frame スタッック番号 で直接移動します。

[1] pry(#<Hello>)> show-stack 
・・・
=> #0  message <Hello#message()>
   #1 [block]   block in run <PryByebug::Processor#run(initial=?, &_block)>
   #2 [method]  run <PryByebug::Processor#run(initial=?, &_block)>
   #3 [method]  resume_pry <PryByebug::Processor#resume_pry(context)>
   #4 [method]  at_line <PryByebug::Processor#at_line(context, _file, _line)>
   #5 [method]  at_line <Byebug::Context#at_line(file, line)>
   #6 [method]  message <Hello#message()>
   #7 [main]    <main>
・・・
[2] pry(#<Hello>)> up
・・・
[3] pry(#<PryByebug::Processor>)> down
・・・
[4] pry(#<Hello>)> frame 7
・・・

s でステップ実行(メソッドに入る) n で次の行へ f でメソッドの外へ c で次のブレイクポイントへ

 => 6:     @hoge = 'hello'
    7:     "hello".capitalize
・・・
[1] pry(#<Hello>)> s
・・・
    6:     @hoge = 'hello'
 => 7:     'hello'.capitalize
・・・

途中でドキュメントやソースを見たくなったら、show-doc 、show-source で見れます。

参考

pryは以下を参考にしました。
ググるよりもまずはpry
Rubyistよ、irbを捨ててPryを使おう
Pryが真の力を発揮してくれる19個のコマンドとコマンドの自作方法[Rails]
Rails4 今のところ最強なデバッグツール達

rubocop

コーディングルールに準拠しているかをチェッックします。
(rubocopは、JavaでいうところのCheckStyle)

プロジェクトで以下のコマンドを打つと違反のある警告を無効にする .rubocop_todo.ymlファイルができます。これを参考に自分たちのコーディングルールに合わせて作ります。

$ rubocop --auto-gen-config

ファイル名を.rubocop.ymlにして、以下を打つと規約違反が表示されます。
-aオプションで一部の警告が自動で補正されます。

$ rubocop -a
・・・
lib/hello.rb:5:5: W: Remove debugger entry point binding.pry.
    binding.pry
    ^^^^^^^^^^^
・・・

syntastic

rubocop(だけではないけど)をvim保存時に実行させるvim pluginです。

:wで保存するとエラー箇所がvim上に表示されます。
カーソルを警告の行に合わせると一番下に警告内容が表示されます。

hello.rb
    1 require 'pry'
S>  2 class Hello
    3   def messagege
    4     @hoge = 'hoge'
S>  5     binding.pry
    6     @hoge = 'hello'
S>  7     binding.pry
    8     @hoge.capitalize
    9   end
   10 end
Missing top-level class documentation comment.

参考

rubocopは以下を参照しました。
Rubocopを使ってコーディングルールへの準拠チェックを自動化
Rubocopをsyntasticを使ってVimから自動実行する