rubyは他の言語と比較してバージョンによる差異が大きく、異なるバージョンのrubyを使用している複数のプロジェクト業務をあるPCで行う場合に、プロジェクト毎に適切なバージョンのrubyを有効化および実行する必要が発生します。この要求はrbenvというツールを使用することで満たすことができます。つまり、rbenvは複数バージョンのrubyが同一システム内に共存することを可能にします。
rubyのライブラリであるgemについてもバージョンによる差異が大きいものがあり、異なるバージョンのgem (rails等) を使用している複数のプロジェクト業務をあるPCで行う場合に、プロジェクト毎に適切なバージョンのgemを有効化および実行する必要が発生します。この要求はbundlerというツールを使用することで満たすことができます。つまり、bundlerは複数バージョンのgemが同一rubyに対して共存することを可能にします。
rbenvの基本
システムにはrubyとgemがそれぞれインストール済みであると仮定して話を進めていますが、インストールされていなくても手順としては同じです。
インストール
rbenvはホームディレクトリ内にインストールします。つまり、同一PCを使用する他のユーザに影響を与えることがありません。具体的な手順としては、yum等のパッケージ管理ツールは使用せず、以下のようにgitレポジトリをクローンします。rbenvのプラグインとしてruby-buildもクローンしておくのを忘れないでください。rbenv自体にはインストール済みのrubyを管理する機能しかなく、ruby-buildでrubyをインストールする機能を追加する必要があります。
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ mkdir ~/.rbenv/plugins
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
クローン後は「~/.bashrc」等にrbenv用の設定を追記します。
~/.bashrc
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"
追記したら
$ source ~/.bashrc
によって設定を反映させましょう。
必要な関連ソフトウェアのインストール
rbenvはその動作のためにいくつかのソフトウェアに依存しているため、それらをシステムのパッケージ管理ツール (yum,homebrew等) でインストールする必要があります。
$ sudo yum install gcc
$ sudo yum install openssl-devel
$ sudo yum install readline-devel
rbenvを用いたrubyのインストール
インストール可能なrubyの一覧を表示してみましょう。
$ rbenv install -l
例えば「2.0.0-p481」のrubyをインストールしたい場合は以下のコマンドを実行します。
$ rbenv install 2.0.0-p481
$ rbenv rehash
インストールが正常に完了したら、確かにインストールされていることを確認してみましょう。
$ rbenv versions
* system (set by /home/username/.rbenv/version)
2.0.0-p481
システムにインストールされていたrubyの他に、先程インストールしたバージョンのrubyが存在しています。「*」が付いているものが有効化されているrubyです。「system」から「2.0.0-p481」に切り替えるためには以下のようにします。
$ rbenv global 2.0.0-p481
戻すためには
$ rbenv global system
とします。ある特定のディレクトリにおいて自動的に有効なバージョンが切り替わるようにするためには
$ rbenv local system
とします。「.ruby-version」というファイルが生成されるだけです。内容もシンプルで
$ cat .ruby-version
system
となっています。なお、rbenvでバージョンを切り替えると、rubyだけでなくgemコマンドのバージョンも対応したものに自動で切り替わりますので、改めてgemコマンドのバージョンを切り替える必要はありません。
bundlerの基本
gemコマンドでインストールするにせよ、bundleコマンドでインストールするにせよ、インストールされたgemパッケージはruby毎に管理されます。同一ruby内で異なるバージョンのgemパッケージを共存させることができるかどうかというところに、gemコマンドとbundleコマンドの違いがあります。
インストール
ややこしいですが、bundleコマンドはgemコマンドでインストールします。"rbenv exec" は「システムrubyのgem」ではなく「rbenvで現在有効なrubyのgem」であることを明記する表記です。"gem" がrbenvで有効なrubyのgemを指している場合は省略可能ではあります。
$ rbenv exec gem install bundler
$ rbenv rehash
これで、以下のコマンドで確認される通り、rbenvで有効なrubyについてbundlerというgemパッケージがインストールされました。
$ rbenv exec gem which bundler
/home/username/.rbenv/versions/2.0.0-p481/lib/ruby/gems/2.0.0/gems/bundler-1.7.2/lib/bundler.rb
あるいは以下のコマンドでもよいです。
$ rbenv exec gem list | grep bundler
bundler (1.7.2)
bundlerを用いたrailsのインストール
設定ファイルを作成します。コマンドは、bundlerではなくbundleです。
$ rbenv exec bundle init
システムrubyのgemパッケージにbundlerは存在しないため、"rbenv exec" で明記する必要も薄く
$ bundle init
とすることが多いです。生成された設定ファイルを編集します
$ vi Gemfile
Gemfile
# A sample Gemfile
source "https://rubygems.org"
gem "rails", "4.0.2"
以下のコマンドで、Gemfileにしたがい「./vendor/bundle」内にrailsをインストールします。
$ bundle install --path vendor/bundle
確かに、railsがインストールされていることが確認できます。
$ bundle exec rails new myApp --skip-bundle
なお、上の例のように、bundleでインストールした「./vendor/bundle」内のgemパッケージを利用する際には「bundle exec」というプレフィックスが必要です。また、「--skip-bundle」というオプションを指定しないとrbenvで現在有効なrubyに対してrailsがインストールされてしまいます。railsインストールは「./vendor/bundle」内に留めたいので、このオプションを忘れないようにしましょう。以上でrailsのローカルディレクトリ「./vendor/bundle」へのインストールは完了です。イメージとしては、「rbenv ∋ rubyおよびgem ∋ bundler ∋ rails」という関係にあります。
Railsのインストール続き
以下の内容は、bundlerの使用方法とは直接関係ありません。railsのインストール手順として、上述の内容は途中ですのでその続きを記載しておきます。概要としては、「./vendor/bundle」内にローカルインストールしたrailsで作成したmyApp内に、railsをローカルインストールするというトリッキーなことをします。まず、ローカルインストールしたrailsを削除します。
$ rm -f Gemfile
$ rm -f Gemfile.lock
$ rm -rf .bundle
$ rm -rf vendor/bundle
myApp内に移動し、自動生成されているGemfile内に記述のあるrailsを含め、gemパッケージをbundlerでローカルインストールします。
$ cd myApp
$ bundle install --path vendor/bundle
参考: Gemfile
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.2' ← ここがポイント。gemパッケージrailsに関する記述があります。
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
...
なお、git管理ファイルには「vendor/bundle」を含めないように「.gitignore」を編集しておくことをお勧めします。gemパッケージのインストールが完了したら
$ bundle exec rails server
としてからブラウザでアクセスしてみましょう。
参考情報
「An error occurred while installing sqlite3 (1.3.9), and Bundler cannot continue.」というエラーが出る場合、sqliteの開発ツールがインストールされていないのかもしれません。以下のコマンドを試してみてください。
$ sudo yum install sqlite-devel
「$ bundle exec rails server」の実行時に「Could not find a JavaScript runtime.」というエラーが出る場合、Gemfileにおける「therubyracer」のコメントアウトを外してみてください。
# gem 'therubyracer', platforms: :ruby (変更前)
gem 'therubyracer', platforms: :ruby (変更後)
その後の「therubyracer」のインストール
$ bundle install --path vendor/bundle
において、「An error occurred while installing libv8 (3.16.14.3), and Bundler cannot continue. Make sure that gem install libv8 -v '3.16.14.3'
succeeds before bundling.」というエラーが出る場合、g++がない状況が原因かもしれませんので、インストールしてから試してみてください。g++がないので、gemパッケージのlibv8についてv8がコンパイルできない可能性があります。
$ sudo yum install gcc-c++
関連記事
- レイアウトおよび部分テンプレートに関するまとめ (Rails4)レイアウトおよび部分テンプレートはどちらもテンプレート (*.html.erb) に共通の要素をまとめておき、任意のテンプレートから利用できるようにしておくための仕組みです。フッターやヘッダーといった大枠はレイアウト、小さなパーツは部分テンプレートというイメージで使い分けましょう。 レイアウトの使用方法 クラス毎に指定する方法と、アクション毎に指定する方法があります。 app/views/layo...
- Ruby コードスニペット (正規表現)sample.rb str = "001: This is a string." var1,var2 = 2,3 # 'EOS'とすると#{}による変数展開がなされない (%03dは展開される) doc = (<<"EOS" % var1) # 括弧は省略可。要は<<"EOS"の次の行からEOSまで。(参: <<-"EOS"とすると前に空白...
- OAuthを用いずにTwitterに自動投稿する (回数制限あり, Selenium with Ruby)Seleniumを用いて、OAuthを用いずにTwitterに自動投稿するRubyスクリプトを記述してみます。連続で複数回実行すると、ボット判定としてキャプチャ認証が発生します。その認証までは通過できませんので悪しからず。また、Twitterの仕様変更次第ではDOMの構造が変化するため、下記サンプルは機能しなくなる恐れが有ります。 twitter_post.rb #!/usr/bin/ruby r...
- Ruby における日本語のエンコーディング日本語を含めて多言語対応する際には、Asciiコード以外の文字コードセットが必要になります。日本語が主となる場合、よく使われる文字セットにはUnicode, Shift_JIS, EUC-JPがあります。このうち Unicode だけは特殊であり、世界中のあらゆる文字を収録しようとしていることから 1 文字を表現するために必要なバイト数が大きくなってしまっています。そのため Unicode のうち...
- Rails3ビューテンプレートの基本的な使用方法 (Ruby)Railsでは、ERB (eRuby (テキストファイルにRubyスクリプトを埋込む書式の仕様) をRubyで実装したもの) を用いてHTML内にRubyスクリプトを埋込むことができます。 <% %> で囲むと出力されません (if-elseなど制御構文を記述します) <%= %> で囲むとエスケープ出力されます <%== %> で囲むとエスケープされずに...