チェリー本:requireでは相対パスでライブラリを指定しない

requirerequire_relativeで自作のプログラムをライブラリとして読み込ませる際に、相対パスで指定できるが、requireの方は相対パスでの指定は推奨されない。今回はその理由についてまとめる。

項目 相対パスの起点 機能
require カレントディレクト カレントディレクトリから
相対パスでファイル読み込み
require_relative 定義ファイルがある場所 定義ファイルの場所から
相対パスでファイル読み込み

上の表に違いとしてまとめたが、相対パスの起点が異なる。これにより、実行時には下記のような違いが出てくる。

require_relativeの場合は、定義ファイルの位置が起点となるため、どこで実行しようが定義ファイルとの位置関係から実行するライブラリは一意に定まる。

requireの場合は、カレントディレクトリの位置が起点となるため、現在のカレントディレクトリの位置により読み込むライブラリが動的に変化してしまい、意図しない同名ファイルを読み込むことで、セキュリティ上の脆弱性に発展してしまう可能性がある。

上記の理由から、requireで自作ライブラリを読み込ませるときには相対パスで指定してはダメ😤。そもそも、自作ライブラリについてはrequire_relativeを用いると覚えておけばよさそう。