我正在尝试制作Capistrano部署脚本。
在我的Capfile中,我确保所有的耙任务都包括
# 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"one_answers"execute"中得到了相同的错误。。。。所以我想在某个地方,少了一些东西。。。。。
您需要告诉Capistrano在哪里(即在什么服务器上)运行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
语法的示例。
正如你已经得到的答案,但让我把灯泡放在基础上。
SSHKit实际上是与Capistrano 3一起开发和发布的,它基本上是一个较低级别的工具,提供了与远程服务器连接和交互的方法;换句话说,它为卡皮斯特拉诺承担了所有的重任。
您需要了解四种主要方法
on()
:指定要在上运行的服务器
within()
:指定要在中运行的目录路径
as()
:指定用户作为运行
with()
:指定要使用运行的环境变量
通常,您将通过使用on()
方法来指定要在其上运行命令的服务器来启动任务。然后可以使用as()
、within()
和with()
方法的任意组合,这些方法可以按任何顺序重复和堆叠。
希望这能帮助您