プラグインから require するときの注意2

preview_attach_columnプラグインと smart_issues_sortプラグインの両方を入れたとき preview_attach_column の機能が効かなくなってしまうということがありました。
原因は、
redmine_preview_attach_column/lib/pac_patches.rb で

require_dependency 'query'

と読み込んだ Queryクラスをいじってメソッドの動きを変更した後に、
redmine_smart_issues_sort/init.rb で

require 'query'

と読み込んで Queryクラスのメソッドを元に戻してしまったためでした。

require_dependency も内部の処理で最終的に require に任せているし、require は同じファイルを二度は読み込まないはすなのになぜ query.rb が二度読み込まれたのでしょう。
require はすでに読み込まれたかどうかを判定するためにファイル名の拡張子を外した部分(feature)を記録して管理しています。
require_dependency はというとファイル名を絶対パスにしてから require に渡します。
そのため require_dependency を使っていた redmine_preview_attach_column側からは

require '<RedmineのROOTディレクトリ>/app/models/query'

として呼ばれ、redmine_smart_issues_sort側からは

require 'query'

として呼ばれ、両者の feature は異なるので二度目の require のときも読み込まれたのです。

同じライブラリを require と require_dependency の両方で読み込んでいないか注意しましょう。