我试图制作Capistrano部署脚本。
在我的Capfile中,我确保包含所有rake任务
# Load tasks
Dir.glob('config/capistrano_tasks/*.rake').each { |r| import r }
接下来我有一个' migrations.rake'含有:
namespace :fileservice do
task :migrate do
within release_path do
info 'Doing migrations'
execute :php, fetch(:symfony_console_path), 'doctrine:migrations:migrate', '--no-interaction', fetch(:symfony_console_flags)
end
end
end
在我的deploy.rb中,我在最后调用任务:
after 'deploy:publishing', 'fileservice:migrate'
出于某种原因,我不断收到错误消息:
NoMethodError: undefined method `within' for main:Object
我不知道在哪里看或有什么可能是错的...当谷歌搜索我得到了很多" NoMethodError"什么,但没有关于'内部'方法和大多数是一般的Ruby错误。
"在"定义?我在轨道上用红宝石做东西吗?还是卡皮斯特拉诺?
希望有人知道从哪里开始寻找或包含哪个库/脚本!
更新:我刚发现没有一种方法可行。删除行时,我得到了相同的错误" info"并且"执行" ....所以我想某处,某些东西不见了.....
答案 0 :(得分:3)
您需要告诉Capistrano where (即在哪些服务器上)运行SSH命令。使用on
块执行此操作,如下所示:
namespace :fileservice do
task :migrate do
on roles(:db) do
within release_path do
info 'Doing migrations'
execute :php, fetch(:symfony_console_path), 'doctrine:migrations:migrate', '--no-interaction', fetch(:symfony_console_flags)
end
end
end
end
根据您希望命令运行的位置,根据您的任务替换roles(:db)
。例如,表达式on roles(:all) do ... end
将在所有服务器上运行命令。
您还可以按照http://capistranorb.com或Capistrano README上的官方文档进行操作,这两个文档都会显示task
/ on
/ execute
语法的示例
答案 1 :(得分:0)
你已经得到了答案,但让我把灯泡从基本开始。
SSHKit实际上是与Capistrano 3一起开发和发布的,它基本上是一个较低级别的工具,提供连接和与远程服务器交互的方法;换句话说,它为卡皮斯特拉诺做了所有繁重的工作。
您需要了解四种主要方法。
on()
:指定要在
within()
:指定要在
as()
:指定要以
with()
:指定要与
通常,您将使用on()
方法启动任务,以指定您希望命令运行的服务器。然后,您可以使用as()
,within()
和with()
方法的任意组合,这些方法可以按任何顺序重复和堆叠。
希望这能帮到你