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()
方法的任意组合,这些方法是可重复的,可以按任意顺序堆叠。
希望对您有所帮助
我正在尝试制作 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()
方法的任意组合,这些方法是可重复的,可以按任意顺序堆叠。
希望对您有所帮助