首页 文章

Rails - 使用Capistrano运行Rake任务

提问于
浏览
2

我在这里挠挠脑袋想知道我是不是在叫错树 . 我有一台服务器,我已经使用Capistrano部署了Rails应用程序 . 最近我向其中一个模型添加了一个新的数据类型,现在我需要运行一个Rake任务来更新现有的记录 .

经过大量的谷歌搜索后,我开始怀疑人们是否会使用Capistrano的Rake任务 . 2013年左右的一些论坛帖子提到Capistrano支持.rake扩展 . 而我发现的其他帖子表明Capistrano有自己的任务自动化系统,并且与rake不兼容 .

我找到了Cape,但我正在寻找,因为它似乎将Rake任务转换为帽子食谱 . 我可能有任何与Capistrano合作的经验,甚至可以在完整的堆栈频谱中工作 .

我想知道的是:如何在远程服务器上运行简单的Rake任务?

为清楚起见,我已经在最新的Ubuntu LTS上安装了应用程序,如果内存服务,则安装14.10 . 我按照教程here进行了操作 . 我有完整的sudo访问权限,我可以进入服务器 .

提前感谢帮助一个菜鸟

2 回答

  • 10

    查看capistrano-rake

    安装完成后,只需执行以下操作,即可在 生产环境 /临时服务器上运行任何rake任务,而无需使用麻烦的capistrano配方:

    $ cap production invoke:rake TASK=your:rake:task
    

    完全披露:我写了

  • 5

    如果您需要更新模型,您当然可以编写Rails迁移 - 这将确保它在尚未运行时运行 .

    如果是一次性任务,在服务器上执行rake任务的最简单方法就是通过ssh . 请参阅您提到的教程中的最后一段:

    cd /opt/www/testapp/current ; bin/rake RAILS_ENV=production db:seed
    

    要回答关于rake的原始问题:你可以通过capistrano执行rake任务,类似于你在本地执行它的方式,只能在capistrano脚本中执行 . 这是一个例子:

    deploy.rb:

    namespace :rake do
      desc "My task"
      task :my_task do
        on roles(:app) do
          within "#{current_path}" do
            with rails_env: :production do
              execute :rake, "my_task"
              # !!!see NOTE at end of answer!!!
            end
          end
        end
      end
    end
    

    您可以通过本地 cap -T 查看所有上限任务 . 我上面写的capistrano任务应该显示为 cap tasks:my_rake_task .

    如果您希望在不进行配置的情况下运行任何可用的rake任务,请执行以下操作:

    namespace :rake do
      desc "Invoke rake task"
      task :invoke do
        on roles(:app) do
          within "#{current_path}" do
            with rails_env: :production do
              execute :rake, ENV['task']
              # !!!see NOTE at end of answer!!!
            end
          end
        end
      end
    end
    

    然后你可以写:

    cap production deploy:invoke task=my:rake:task
    

    注意:您可能希望用执行行替换

    run "bin/rake RAILS_ENV=#{rails_env} #{ENV['task']}"
    

    使用与教程相同的语法(没有binstubs,你可能需要首先配置capistrano / bundler和capistrano / rbenv ......)

相关问题