require
とrequire_relative
で自作のプログラムをライブラリとして読み込ませる際に、相対パスで指定できるが、require
の方は相対パスでの指定は推奨されない。今回はその理由についてまとめる。
項目 | 相対パスの起点 | 機能 |
---|---|---|
require |
カレントディレクトリ | カレントディレクトリから 相対パスでファイル読み込み |
require_relative |
定義ファイルがある場所 | 定義ファイルの場所から 相対パスでファイル読み込み |
上の表に違いとしてまとめたが、相対パスの起点が異なる。これにより、実行時には下記のような違いが出てくる。
require_relative
の場合は、定義ファイルの位置が起点となるため、どこで実行しようが定義ファイルとの位置関係から実行するライブラリは一意に定まる。
require
の場合は、カレントディレクトリの位置が起点となるため、現在のカレントディレクトリの位置により読み込むライブラリが動的に変化してしまい、意図しない同名ファイルを読み込むことで、セキュリティ上の脆弱性に発展してしまう可能性がある。
上記の理由から、require
で自作ライブラリを読み込ませるときには相対パスで指定してはダメ😤。そもそも、自作ライブラリについてはrequire_relative
を用いると覚えておけばよさそう。