Is there a way to set a default stage in Capistrano 3?
I've tried putting set :stage, :production
inside deploy.rb but that didn't work, it gives the error:
Stage not set, please call something such as `cap production deploy`,
where production is a stage you have defined
I only have one stage right now so I want to be able to just run cap deploy
and have it execute on the default.
You can add the following line to your deploy.rb, which will prevent Capistrano from expecting a stage:
The old solution works for me in Capistrano 3:
At the very top of the
Capfile
after these linesadd:
and then run you task as usual without the stage specified:
After I
cd
into the RAILS Root directory, issuing the command:cap development deploy
seems to work. Earlier I was in the app/models folder and issuing the command came back with this error:
Stage not set, please call something such as cap production deploy, where production is a stage you have defined.
Capistrano v3 is somewhat of a wrapper around Rake, so you need to realize that what's really happening is that a
production
task is getting run first, followed by adeploy
task.If you debug it a little, you'll find that
deploy.rb
doesn't get loaded when you don't type in a stage. This is because the stage's task is wheredeploy.rb
gets loaded: Looking atlib/setup.rb
, a task is defined for each stage. When run, the stage's task sets:stage
, loads up the capistrano defaults, and then finally loads yourdeploy.rb
file.So, an easy trick would be to tell Capistrano to invoke the stage task every time you run
cap
by adding this to the end of yourCapfile
(not yourdeploy.rb
):or, using the
invoke
method from Capistrano's DSL:This may have some unintended consequences if you actually do use multiple stages, but if you only ever use the
production
stage, it should work fine.Another easy solution could be a simple shell alias, such as
alias cap='cap production'
, but it might not work great if you have multiple projects with different stage names.New answer for capistrano 3.6+: It's better to use
invoke :production unless Rake.application.options.show_tasks
to avoid the warning which you would otherwise get withcap -T