14

Sto utilizzando Capistrano 3 con un'applicazione Rails 4 appena generata. Il mio schieramento sta funzionando, ma quando ho eseguito bundle exec rails console sul server di produzione, ottengo un avvertimento da Rails:Implementazione di Capistrano 3 per conflitti tra binstub Rails 4?

Sembra ./bin/rails della tua app è uno stub che è stato generato da Bundler.

In Rails 4, la cartella/directory della tua app contiene gli eseguibili con versione come qualsiasi altro codice sorgente, anziché gli stub generati su richiesta.

Infatti i binstubs generati durante la distribuzione sovrascrivere i binstubs nel repository:

Il binstub originale:

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

La binstub nella produzione:

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

ciò che deve cambiare per rendere la configurazione Capistrano compatibile con 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} 
# ... 

Tutto il resto utilizza le impostazioni predefinite.

risposta

29

Poiché la directory ./bin è controllata dalla versione in Rails 4, è necessario impedire a Capistrano di collegarlo alle distribuzioni rimuovendo bin da set :linked_dirs. Ora per impedire a bundler di sovrascrivere i binstub con controllo della versione, possiamo aggiungere la riga set :bundle_binstubs, nil che impedirà di impostare capistrano-bundler dall'opzione --binstubs quando si esegue l'installazione del pacchetto.

Spero che questo aiuti!

+3

Questa soluzione esatta è implementata come una soluzione per questo problema molto qui https://github.com/capistrano/bundler/issues/45 – s01ipsist

+0

Ah, buono a sapersi, grazie per il link! –

Problemi correlati