NoMethodError: undefined method `within' for main:Object

NoMethodError: undefined method `within' for main:Object

我正在尝试制作 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" 的点击,但 none 关于 'within' 方法,而且大多数是一般 Ruby 个错误。

"within"应该定义在哪里?我在 rails 上点了 ruby 东西?还是 Capistrano?

希望有人知道从哪里开始寻找或包括哪个库/脚本!

更新: 我刚刚发现 none 的方法有效。删除行时,我得到了 "info" 和 "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, or the Capistrano README 上的官方文档进行操作,它们都显示了 task/on/execute 语法的示例。

因为你已经得到了答案,但是让我把灯泡从基本的。

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

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

on(): 指定服务器运行 on

within():指定运行在

中的目录路径

as():指定用户运行为

with():指定环境变量为运行和

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

希望对您有所帮助