Потенциал Capistrano 3 для конфликта с Rails 4 binstubs?

Я использую Capistrano 3 с недавно созданным приложением Rails 4. Мое развертывание работает, но когда я запускаю bundle exec rails console на рабочем сервере, я получаю предупреждение от Rails:

Похоже, ваше приложение. /bin/rails - это заглушка, созданная Bundler.

В Rails 4 ваш каталог приложений /bin содержит исполняемые файлы, которые версируются как любой другой исходный код, а не заглушки, которые генерируются по требованию.

Действительно, binstubs, созданные во время развертывания, перезаписывают binstubs в репозитории:

Оригинальный binstub:

$ cat bin/rails

#!/usr/bin/env ruby
begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rails/commands'

Идентификатор в производстве:

$ cat bin/rails

#!/usr/bin/env ruby
#
# This file was generated by Bundler.
#
# The application 'rails' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'pathname'
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../../releases/20140930173754/Gemfile",
  Pathname.new(__FILE__).realpath)

require 'rubygems'
require 'bundler/setup'

load Gem.bin_path('railties', 'rails')

Что нужно изменить, чтобы сделать конфигурацию Capistrano совместимой с Rails 4?

# Gemfile
group :development do
  gem 'capistrano', '~> 3.1'
  gem 'capistrano-rbenv', '~> 2.0'
  gem 'capistrano-bundler', '~> 1.1.2'
  gem 'capistrano-rails', '~> 1.1'
end

# config/deploy.rb
lock '3.2.1'
# ...
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
set :rbenv_map_bins, %w{rake gem bundle ruby rails}
# ...

Все остальное использует настройки по умолчанию.

Ответы

Ответ 1

Так как каталог ./bin управляется версиями в Rails 4, нам нужно запретить Capistrano связывать его с развертываниями, удалив bin из set :linked_dirs. Теперь, чтобы предотвратить перезагрузку бункера с помощью управляемых версиями binstubs, мы можем добавить строку set :bundle_binstubs, nil, которая предотвратит установку capistrano-bundler параметра --binstubs при запуске установки пакета.

Надеюсь, что это поможет!