Edited at

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

More than 1 year has passed since last update.

普段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から自動実行する