【Rails】【Capistrano】Staging環境で「bundle exec rails console」しても動作しない
はじめに
Webサービスを開発していて、ハマったところなのでメモ。
環境
- OS X El capitan
- Ruby 2.3.0
- carrierwave 0.11.2
- fog 1.38.0
- Ruby on Rails 4.2.4
- Capistrano 3.4.0
- capistrano-bundler 1.1.4
詳細
CapistranoでVPSサーバなどにデプロイした後
サーバ側で「bundle exec rails console」を実行した際に
以下の様な情報が出力されてしまいました。
$ bundle exec rails c Usage: rails new APP_PATH [options] Options: -r, [--ruby=PATH] # Path to the Ruby binary of your choice ...以下略...
また、config/deploy.rb は以下の通り設定していました。
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets vendor/assets/bower_components}
なお、おさらいとしてですが
rails consoleを起動するとき、bin/railsの内容が呼び出されるようになっています。
この設定は、新規でプロジェクトを作ったときから有効です。
元にローカル環境では問題なく使えていました。
bin/rails
#!/usr/bin/env ruby APP_PATH = File.expand_path('../../config/application', __FILE__) require_relative '../config/boot' require 'rails/commands'
解決策
config/deploy.rb に以下の記述を追加する。
set :bundle_binstubs, -> { shared_path.join('bin') }
また、「set :linked_dirs」から「bin」を削除する。
上記のように定義した後、Capistranoでデプロイして bin配下にファイルが設定されていればOKです。
原因
1つ目は、binをsharedディレクトリにしていたのにも 関わらず、bin配下の内容を配置していなかったことです。
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets vendor/assets/bower_components}
2つ目は、capistrano-bundler 1.1.4から仕様が変更になったようです。
そして、GitHubにあるドキュメントのUsageを見ると、bin配下のものは
以下のように定義するように書いてありました。
set :bundle_binstubs, -> { shared_path.join('bin') }