14

Ich benutze Capistrano 3 mit einer neu erstellten Rails 4 App. Mein Einsatz funktioniert, aber wenn ich bundle exec rails console auf dem Produktionsserver laufen lasse, erhalte ich eine Warnung von Rails:Capistrano 3-Bereitstellung für Rails 4 binstubs Konflikt?

Sieht aus wie ./bin/rails Ihre App ist ein Stummel, der von Bündler generiert wurde.

In Rails 4 enthält das Verzeichnis/Verzeichnis der Anwendung ausführbare Dateien, die wie jeder andere Quellcode versioniert sind, und keine Stubs, die bei Bedarf generiert werden.

der Tat die binstubs während des Einsatzes erzeugt die binstubs im Repository überschreiben:

Die ursprüngliche 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' 

Die binstub in der Produktion:

$ 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') 

Was muss sich ändern um die Konfiguration von Capistrano mit Rails 4 kompatibel zu machen?

# 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} 
# ... 

Alles andere verwendet die Standardeinstellungen.

Antwort

29

Da das Verzeichnis ./bin in Rails 4 versionsgesteuert ist, müssen wir verhindern, dass Capistrano es bei Bereitstellungen verknüpft, indem bin von set :linked_dirs entfernt wird. Um zu verhindern, dass Bundler die versionsbasierten Binstubs überschreibt, können wir die Zeile set :bundle_binstubs, nil hinzufügen, die verhindert, dass capistrano-bundler die Option --binstubs beim Ausführen der Bundle-Installation setzt.

Hoffe, dass hilft!

+3

Diese genaue Lösung ist als eine Lösung für dieses Problem hier https://github.com/capistrano/bundler/issues/45 – s01ipsist

+0

Ahh gut zu wissen, danke für den Link! –