LoginSignup
3
1

More than 5 years have passed since last update.

Rubyのloadの優先順位について

Last updated at Posted at 2017-03-09

capistranoでdeploy.rbのディレクトリ名をcapistrano/deploy.rbに配置したら、deploy.rbが読まれないという事件に遭遇しました。 
ディレクトリの構造的にはこんな感じ

$ tree
.
├── Capfile
├── Gemfile
├── Gemfile.lock
└── capistrano
    ├── deploy
    │   ├── production.rb
    │   └── staging.rb
    └── deploy.rb

    
原因はcapistranoというディレクトリ名が悪かったのですが、なぜcapistranoというディレクトリ名が悪いのか?
気になったので調べてみました。

capistranoのdeploy.rbについて調べてみた

capistranoのdeploy.rbのディレクトリ名を変更する場合に、Capfileでdeploy_config_pathで変更したパスを指定すればいいのだと思います。

例えばcap/deploy.rbというディレクトリ名にした場合には

set :deploy_config_path, 'cap/deploy.rb'

と指定します。

ではdeploy_config_pathは一体どのように使われているのでしょうか?
Githubのcapistranoのリポジトリで検索してみるとhttps://git.io/vy2L3ここで使われていることがわかります。

つまりloadを使ってdeploy.rbが読み込まれているわけです。

loadについて調べてみた

loadはどのように読み込むファイルを決めているのか?
答えは大体ここに書かれていました。

Rubyのロード機構について

しかしここを読んだ時に一つだけ疑問に思いました。

ロードパスの優先順位はどうなっているのだろうか?

これに関しては検証用のコードを用意してみました。

実験結果からロードの順番は

  • $LOAD_PATHの上から順にロードされていく。
  • $LOAD_PATHの中からファイルがロードされない場合は、実行しているディレクトリ以下からロードする。

ってことだと思います。(間違ってたら指摘してください)

ということでやはりcapistranoというディレクトリ名だとcapistrano本体のdeploy.rb がロードされてしまうためダメみたいです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1