【Rails】【Capistrano】Staging環境で「bundle exec rails console」しても動作しない

はじめに

Webサービスを開発していて、ハマったところなのでメモ。

環境

詳細

CapistranoVPSサーバなどにデプロイした後
サーバ側で「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から仕様が変更になったようです。

qiita.com

そして、GitHubにあるドキュメントのUsageを見ると、bin配下のものは
以下のように定義するように書いてありました。

set :bundle_binstubs, -> { shared_path.join('bin') }

github.com