当前位置:  开发笔记 > 后端 > 正文

如何从Capistrano运行rake任务?

如何解决《如何从Capistrano运行rake任务?》经验,为你挑选了8个好方法。

我已经有一个deploy.rb可以在我的生产服务器上部署我的应用程序.

我的应用程序包含一个自定义rake任务(lib/tasks目录中的.rake文件).

我想创建一个能够远程运行该rake任务的上限任务.



1> 小智..:

更明确一点,在您的\config\deploy.rb外部添加任何任务或命名空间:

namespace :rake do  
  desc "Run a task on a remote server."  
  # run like: cap staging rake:invoke task=a_certain_task  
  task :invoke do  
    run("cd #{deploy_to}/current; /usr/bin/env rake #{ENV['task']} RAILS_ENV=#{rails_env}")  
  end  
end

然后,从/rails_root/,您可以运行:

cap staging rake:invoke task=rebuild_table_abc


使用'bundle exec'(如果可用)

2> marinosb..:

Capistrano 3通用版(运行任何rake任务)

构建Mirek Rusin的通用版本的答案:

desc 'Invoke a rake command on the remote server'
task :invoke, [:command] => 'deploy:set_rails_env' do |task, args|
  on primary(:app) do
    within current_path do
      with :rails_env => fetch(:rails_env) do
        rake args[:command]
      end
    end
  end
end

用法示例: cap staging "invoke[db:migrate]"

请注意,deploy:set_rails_env要求来自capistrano-rails gem



3> Richard Poir..:
run("cd #{deploy_to}/current && /usr/bin/env rake `` RAILS_ENV=production")

发现它与谷歌 - http://ananelson.com/said/on/2007/12/30/remote-rake-tasks-with-capistrano/

RAILS_ENV=production是一个陷阱 - 我一开始并没有想到它,也无法弄清楚为什么任务没有做任何事情.


一个人应该真的尊重capistrano的rake设置`"cd#{deploy_to}/current &&#{rake} RAILS_ENV = production"`
一个小改进:如果用&&替换分号,那么第二个语句(运行rake任务)将不会运行,如果第一个语句(更改目录)失败.
如果要部署到多个服务器,这将不起作用.它将多次运行rake任务.

4> Mirek Rusin..:

......几年后......

看看capistrano的rails插件,你可以在https://github.com/capistrano/rails/blob/master/lib/capistrano/tasks/migrations.rake#L5-L14看到它看起来像:

desc 'Runs rake db:migrate if migrations are set'
task :migrate => [:set_rails_env] do
  on primary fetch(:migration_role) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rake, "db:migrate"
      end
    end
  end
end


这仅适用于capistrano v3.

5> captainpete..:

使用Capistrano风格的rake调用

有一种常见的方式可以"与" require 'bundler/capistrano'和其他修改rake的扩展一起工作.如果您使用多级,这也适用于预生产环境.要旨?如果可以,请使用config vars.

desc "Run the super-awesome rake task"
task :super_awesome do
  rake = fetch(:rake, 'rake')
  rails_env = fetch(:rails_env, 'production')

  run "cd '#{current_path}' && #{rake} super_awesome RAILS_ENV=#{rails_env}"
end


这是最好的解决方案,使用capistrano值
可能值得补充的是,如果您的任务是命名空间(即不在顶级命名空间中定义),您可能必须使用`top.run`而不仅仅是`run`

6> Sheharyar..:

使用capistrano-rake宝石

只需安装gem而不会弄乱自定义capistrano配方,并在远程服务器上执行所需的rake任务,如下所示:

cap production invoke:rake TASK=my:rake_task

完全披露:我写了


用于Rails 5项目,效果很好。

7> Szymon Jeż..:

我个人在生产中使用这样的辅助方法:

def run_rake(task, options={}, &block)
  command = "cd #{latest_release} && /usr/bin/env bundle exec rake #{task}"
  run(command, options, &block)
end

这允许运行类似于使用run(command)方法的rake任务.


注意:它类似于杜克提出的,但我:

使用latest_release而不是current_release - 根据我的经验,它更像你在运行rake命令时所期望的;

遵循Rake和Capistrano的命名约定(而不是:cmd - > task和rake - > run_rake)

不要设置RAILS_ENV =#{rails_env},因为设置它的正确位置是default_run_options变量.例如default_run_options [:env] = {'RAILS_ENV'=>'production'}# - >干!



8> yacc..:

有一个有趣的宝石斗篷,使你的rake任务可用作Capistrano任务,所以你可以远程运行它们.cape有详细记录,但这里有一个关于如何设置我的简短概述.

安装gem之后,只需将其添加到您的config/deploy.rb文件中即可.

# config/deploy.rb
require 'cape'
Cape do
  # Create Capistrano recipes for all Rake tasks.
  mirror_rake_tasks
end

现在,您可以在rake本地或远程运行所有任务cap.

作为一个额外的好处,cape让您可以设置本地和远程运行rake任务的方式(不再需要bundle exec rake),只需将其添加到您的config/deploy.rb文件中:

# Configure Cape to execute Rake via Bundler, both locally and remotely.
Cape.local_rake_executable  = '/usr/bin/env bundle exec rake'
Cape.remote_rake_executable = '/usr/bin/env bundle exec rake'

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有