Rubyでライブラリを読み込む際に使うrequireに、独自のライブラリパスを追加できるのをご存じでしょうか。標準ライブラリやRubyGemsのライブラリだけ使っているのであれば、ライブラリのパスを気にすることはありません。しかし複数のソースファイルを使う場合や独自のライブラリを使う場合は、requireの使い方に注意が必要です。
今回はRubyのrequireの使い方と、requireを使う場合に知っておきたいライブラリパスの仕組みについて解説します。
Rubyのrequireとは
RubyのプログラムではRubyGemsなどの外部ライブラリを利用する際に、requireで読み込みます。さらに複数のソースファイルを利用するプログラムで、ソースファイルを取り込む際に使うのもrequireです。
まずはRubyのrequireの使い方について紹介します。
ライブラリを取り込む
Rubyのプログラムで利用できる全ての変数やメソッドは必ずいずれかのクラスに属しています。Rubyで標準に組み込まれたクラスだけでもある程度のプログラムが組めますが、利用実績のあるクラスが組み込まれた外部のライブラリを利用するのが一般的です。
そして、そのような外部ライブラリとしてよく使われているのがRubyGemsに登録されたライブラリです。そのためRubyGemsからダウンロードしたライブラリを利用するケースも少なくありません。
このようにRubyのコマンド付属のクラス以外の、標準ライブラリや外部ライブラリをプログラムで利用できるようにする機能がrequireです。
requireでライブラリを読み込む書き方
require “ライブラリ名”
プログラムを複数に分ける
Rubyは少ない記述でプログラムが書ける言語ですが、短いプログラムで複雑なシステムを構築できる訳ではありません。プログラムが長くなると複数に分割して管理するケースがよくあります。
そのような場合、分割したソースファイルの読み込みにもrequireが使われます。なおこのようなソースファイルの読み込みには、相対パスでファイル名を指定するのが一般的です。
Rubyのソースコードを読み込む書き方
require “ソースファイル”
Rubyのソースコードを読み込む例
require "../common/file.rb"
requireをカスタマイズする
requureでライブラリを読み込む際はパスを指定する必要が無いのに、ソースファイルを取り込むのに相対パスで指定する点を不思議に思われた方がいたのではないでしょうか。
requireは、相対パスが指定されていればそのパスを参照し、パスが無い場合はデフォルトで設定されているパスから指定されたライブラリを探します。
なおデフォルトで設定されているパスは、Rubyの実行時やプログラムの中で特定のパスを追加することが可能です。必要に応じてrequireをカスタマイズしてください。
requireで読み込むライブラリはどこにある
先ほど紹介したようにrequireで読み込むライブラリはデフォルトで設定されているパスから参照されます。そしてそのパスをチェックしたり変更することが可能です。
次からrequireを使うためにRubyのライブラリの格納場所について解説します。
標準ライブラリの格納場所
requireで参照するライブラリのパスは、Rubyのコマンドをコンパイルした際に決められています。Rubyの公式サイトからソースコードをダウンロードして自分で作る場合はライブラリのパスを自由に決めることが可能です。
とはいえ自分でソースファイルからコンパイルするケースは少ないでしょう。CentOSやUbuyntuなどのLinuxで標準にインストールできるRubyでは、それぞれのディストリビューションで決めた場所にライブラリが格納されています。そして格納場所は次のコマンドで簡単に調べることが可能です。
標準ライブラリの格納場所を調べるコマンド
$ ruby -e 'puts $:' または $ ruby -e 'puts $LOAD_PATH' CentOSの実行例
/usr/share/gems/gems/did_you_mean-1.2.0/lib /usr/local/share/ruby/site_ruby /usr/local/lib64/ruby/site_ruby /usr/share/ruby/vendor_ruby /usr/lib64/ruby/vendor_ruby /usr/share/rubygems /usr/share/ruby /usr/lib64/ruby
requireの参照先を追加する方法
requireはデフォルトで設定されているパスを参照し、指定されたライブラリやソースファイルを読み込みます。外部のソースファイルを読み込む際に相対パスで記述することも可能ですが、そのソースファイルがあるディレクトリを参照パスに追加し、ファイル名だけを指定することも可能です。
次からrequireの参照先を追加する手順について解説します。
requireの参照先は組み込み変数
requireの参照先は組み込み変数「$:」に格納されているので、この変数を表示すればデフォルトの参照パスをチェックできます。
そして「$:」を編集することで新しいパスを追加することが可能です。requireを実行する前にパスを追加すれば、外部のソースファイルを相対パスの指定ではなくファイル名だけで読み込めます。
requireの参照先としてカレントディレクトリを追加する例
$:.unshift File.dirname(__FILE__) require 'local_lib.rb'
「$:」の別名を使う
先ほどrequireの参照先は組み込み変数「$:」を紹介しましたが、この変数には別名があり、それらを「$:」と同じように扱うことが可能です。「$:」の別名とは「$LOAD_PATH」と「$-I」の2つです。
「$:」の別名
$LOAD_PATH
$-I
$LOAD_PATHを使った例
$LOAD_PATH.unshift File.dirname(__FILE__) require 'local_lib.rb'
$-Tを使った例
$-I.unshift File.dirname(__FILE__) require 'local_lib.rb'
rubyコマンドの-Iオプションを使う
rubyを実行する際、「-I」オプションにライブラリの参照パスを指定することで、先ほど紹介した組み込み変数「$:」にそのパスを追加できます。ターミナルなどからrubyコマンドを実行する場合、この方法も利用してください。
-Iオプションの使い方
ruby -I デフィレクトリ名
-Iオプションを使う例
$ ruby -I /home/www/lib
まとめ
Rubyでライブラリの読み込みに使うrequireは、相対パスでファイル名を指定できますが、通常はライブラリ名のみ指定します。
これまで説明したようにreauireでパスを指定しなかった場合のデフォルトの参照パスは決まっています。ただし、その参照パスは組み込み変数「$:」や-Iオプションで変更することが可能です。
もしRubyで大きなプログラムを作る場合、requireの仕組みを理解していると幾つものファイルをrequireで簡潔に取り込むプログラムを書けます。ぜひRubyのプログラミングで活用してください。