NoMethodError:未定义的方法`在' for main:对象

时间:2016-07-27 12:42:09

标签: ruby-on-rails ruby capistrano capistrano3 rake-task

我试图制作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"并且"执行" ....所以我想某处,某些东西不见了.....

2 个答案:

答案 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.comCapistrano README上的官方文档进行操作,这两个文档都会显示task / on / execute语法的示例

答案 1 :(得分:0)

你已经得到了答案,但让我把灯泡从基本开始。

SSHKit实际上是与Capistrano 3一起开发和发布的,它基本上是一个较低级别的工具,提供连接和与远程服务器交互的方法;换句话说,它为卡皮斯特拉诺做了所有繁重的工作。

您需要了解四种主要方法。

on() :指定要在

上运行的服务器

within() :指定要在

中运行的目录路径

as() :指定要以

运行的用户

with() :指定要与

一起运行的环境变量

通常,您将使用on()方法启动任务,以指定您希望命令运行的服务器。然后,您可以使用as()within()with()方法的任意组合,这些方法可以按任何顺序重复和堆叠。

希望这能帮到你

相关问题