ruby on rails - rails - Establecer escenario por defecto con Capistrano 3
capistrano ruby (5)
¿Hay una manera de establecer un escenario predeterminado en Capistrano 3?
He intentado poner set :stage, :production
,: set :stage, :production
en deploy.rb pero eso no funcionó, da el error:
Stage not set, please call something such as `cap production deploy`,
where production is a stage you have defined
Solo tengo una etapa en este momento, por lo que quiero poder ejecutar el cap deploy
y hacer que se ejecute de forma predeterminada.
Capistrano v3 es algo así como un envoltorio alrededor de Rake, por lo que debe darse cuenta de que lo que realmente está sucediendo es que una tarea de production
se ejecuta primero, seguida de una tarea de deploy
.
Si lo depura un poco, encontrará que deploy.rb
no se carga cuando no escribe una etapa. Esto se debe a que la tarea de la etapa es donde se carga deploy.rb
: Al mirar lib/setup.rb
, se define una tarea para cada etapa. Cuando se ejecuta, la tarea del escenario establece :stage
, carga los valores predeterminados de capistrano y, finalmente, carga su archivo deploy.rb
.
Por lo tanto, un truco fácil sería decirle a Capistrano que invoque la tarea del escenario cada vez que ejecute cap
agregando esto al final de su Capfile
( no su deploy.rb
):
Rake::Task[:production].invoke
o, usando el método de invoke
del DSL de Capistrano:
invoke :production
Esto puede tener algunas consecuencias no deseadas si realmente usa varias etapas, pero si solo usa la etapa de production
, debería funcionar bien.
Otra solución fácil podría ser un simple alias de shell, como alias cap=''cap production''
, pero podría no funcionar bien si tiene varios proyectos con diferentes nombres de etapas.
Después de que yo cd
en el directorio raíz de RAILS, emitiendo el comando:
cap development deploy
parece funcionar. Anteriormente estuve en la carpeta de aplicaciones / modelos y emití el comando con este error:
Stage not set, please call something such as cap production deploy, where production is a stage you have defined.
La vieja solución me funciona en Capistrano 3:
cap --version
#=> Capistrano Version: 3.3.5 (Rake Version: 10.4.2)
En la parte superior del Capfile
después de estas líneas
# Load DSL and Setup Up Stages
require ''capistrano/setup''
añadir:
set :stage, :production
y luego ejecute su tarea como de costumbre sin la etapa especificada:
cap foo:bar
Nueva respuesta para capistrano 3.6+: es mejor usar invoke :production unless Rake.application.options.show_tasks
para evitar la advertencia que de lo contrario obtendría con cap -T
Puede agregar la siguiente línea a su deploy.rb, lo que evitará que Capistrano espere una etapa:
set :stages, ["production"]