capistrano3でRAILS_ENV
を指定してrake
を実行するのに手間取ったので、ここで共有します。
##問題 下記の方法ではrails_envが呼べない
deploy.rb
namespace :deploy do
task :reset_db do
on roles(:app) do
execute "cd #{deploy_to}/current && bundle exec rake db:seed RAILS_ENV=#{rails_env}"
end
end
end
上記の方法だと下記のようなrails_envが定義されていないことを示すエラーが出ます。
cap aborted!
undefined local variable or method 'rails_env' for #<SSHKit::Backend::Netssh:0x007f1cd58044b0>
##解法1 fetchを通して呼ぶ
deploy.rb
namespace :deploy do
task :reset_db do
on roles(:app) do
execute "cd #{deploy_to}/current && bundle exec rake db:seed RAILS_ENV=#{fetch :rails_env}"
end
end
end
こうして書くと、文字列内でrails_env
を呼べます
##解法2 withを使う
下の例ではcd #{deploy_to}/current
も簡素化するためにwithin
を使っています
deploy.rb
namespace :deploy do
task :reset_db do
on roles(:app) do
within release_path do
with rails_env: fetch(:rails_env) do
execute :rake, "db:migrate:reset"
end
end
end
end
end
こうして書くと指定したRAILS_ENV
でrake
を実行できます
参考
http://blog.huangzhimin.com/2013/11/02/upgrade-to-capistrano3/