我在这里挠我的头,想知道我是不是撞错了树。我有一个服务器,我已经部署了一个Rails应用程序到使用卡皮斯特拉诺。最近,我向其中一个模型添加了一个新的数据类型,现在我需要运行Rake任务来更新现有的记录。
在谷歌上搜索了很多之后,我开始怀疑人们是否会在Capistrano上使用Rake任务。一些论坛在2013年左右的帖子中提到卡皮斯特拉诺支持.rake扩展。而我发现的其他帖子表明,Capistrano有自己的任务自动化系统,并且与rake不兼容。
我找到了好望角,但我不确定这是否是我要寻找的,因为它似乎把Rake任务转换成了cap菜谱。这可能是我弄错了,我真的没有任何经验,与卡皮斯特拉诺,甚至在整个堆栈频谱工作经验。
我想知道的是:如何在远程服务器上运行简单的Rake任务?
为了清晰起见,我已经在最新的Ubuntu上安装了这个应用程序,如果内存正常的话,是14.10。我按照教程找到了这里。我有完全的sudo访问权限,我可以ssh进入服务器。
提前感谢你帮了个菜鸟
发布于 2015-02-14 09:06:22
如果您需要更新模型,当然可以编写一个Rails迁移--这将确保它在尚未运行的情况下运行。
在服务器上执行rake任务的最简单方法是通过ssh,如果它是一次性任务的话。请参阅您提到的教程中的最后一段:
cd /opt/www/testapp/current ; bin/rake RAILS_ENV=production db:seed
要回答关于rake的原始问题:您可以通过capistrano执行rake任务,类似于在本地执行rake任务的方式,只在capistrano脚本中执行。下面是一个例子:
deploy.rb:
namespace :rake do
desc "My task"
task :my_task do
on roles(:app) do
within "#{current_path}" do
with rails_env: :production do
execute :rake, "my_task"
# !NOTE at end of answer!
end
end
end
end
end
您可以在本地通过cap -T
查看所有cap任务。我上面写的capistrano任务应该显示为cap tasks:my_rake_task
。
如果希望在不进行配置的情况下运行任何可用的rake任务,请执行以下操作:
namespace :rake do
desc "Invoke rake task"
task :invoke do
on roles(:app) do
within "#{current_path}" do
with rails_env: :production do
execute :rake, ENV['task']
# !NOTE at end of answer!
end
end
end
end
end
然后你可以写:
cap production deploy:invoke task=my:rake:task
注意:您可能希望将执行行替换为
run "bin/rake RAILS_ENV=#{rails_env} #{ENV['task']}"
要使用与教程相同的语法(如果没有binstub,您可能需要首先配置capistrano/bundler和capistrano/rbenv .)
发布于 2016-04-01 07:23:38
安装完毕后,只需执行以下操作,就可以在生产/暂放服务器上运行任何rake任务,而不需要混乱的capistrano食谱:
$ cap production invoke:rake TASK=your:rake:task
全披露:我写的
https://stackoverflow.com/questions/28517458
复制相似问题