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
はどのように読み込むファイルを決めているのか?
答えは大体ここに書かれていました。
しかしここを読んだ時に一つだけ疑問に思いました。
ロードパスの優先順位はどうなっているのだろうか?
これに関しては検証用のコードを用意してみました。
実験結果からロードの順番は
-
$LOAD_PATH
の上から順にロードされていく。 -
$LOAD_PATH
の中からファイルがロードされない場合は、実行しているディレクトリ以下からロードする。
ってことだと思います。(間違ってたら指摘してください)
ということでやはりcapistrano
というディレクトリ名だとcapistrano本体のdeploy.rb がロードされてしまうためダメみたいです。