如何使用 Capistrano 在服务器上执行命令?

如何使用 Capistrano 在服务器上执行命令?

我有一个非常简单的任务,叫做 update_feeds:

desc "Update feeds"
task :update_feeds do
  run "cd #{release_path}"
  run "script/console production"
  run "FeedEntry.update_all"
end

每当我尝试运行此任务时,我都会收到以下消息:

[out :: mysite.com] sh: script/console: No such file or directory

我认为这是因为我没有在正确的目录中,但是尝试

run "cd ~/user/mysite.com/current"

代替

run "cd #{release_path}"

也失败了。手动运行完全相同的命令(通过 ssh)可以完美运行。为什么 capistrano 无法正确cd(更改目录)进入站点目录来运行命令?

谢谢!

答案1

每个run命令基本上都在其自己的 shell 环境中执行。因此,您需要执行以下操作:

run "cd #{release_path} && script/console production"

但是您无法运行命令 script/consolescript/console这种方式交互的用法。

你想要的是script/runner这样的:

run "cd #{release_path} && script/runner -e production 'FeedEntry.update_all'"

我希望这能有所帮助。

答案2

你应该使用:

execute "cd #{release_path} && script/console production"

使用 capistrano 3.x

答案3

正确的做法是使用 within ,如下所示:

within variable_with_the_folder_path do
    execute :command, parameter
end

例如:

    # Bower Cache Clean:
    bower_path = fetch(:bower_path)
    within bower_path do
      execute :node, "#{bower_path_to_bin}", 'cache clean'
    end

相关内容