轨道上的红宝石 - NoMethodError: main:Object 的未定义方法 'within'



我正在尝试制作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()方法的任意组合,这些方法可以按任何顺序重复和堆叠。

希望这能帮助您

最新更新