2

他の2つのrakeタスクを呼び出すRakeタスクを作成しようとしています。ここここで関連する質問をしている人を見つけましたが、あまり役に立ちませんでした。これは私がこれまで一緒に石畳にしたものです。私が間違っていることについて何か考えはありますか?

task :cron => :environment do
  #if Time.now.hour % 2  == 0 
    Rake::Task["robots:update_robots"].reenable
    Rake::Task["robots:update_robots"].invoke
  #end
end

ご覧のとおり、これはHerokuが実行することを目的としたcronジョブです。しかし、私はそれが機能していることをテストできるように、私が必要としないものをコメントアウトしました。

私はこのエラーを受け取り続けます:

タスク「robots:update_robots」の作成方法がわからない

しかし、その理由はわかりません。

更新:それで、cronrakeタスクによって呼び出されていた元のタスクを実行できなかったことがわかりました。しばらくは問題なく動作していました。どこかで購入し、「更新」の「d」を削除しました。したがって、このコマンドRake :: Task ["robots:upate_robots"]。executeは、ロボットのrakeタスクが「update」ではなく「upate」であったために実行されませんでした。

Tl; dr:タイプミス。

4

1 に答える 1

3

一般に、ソリューションは機能するはずです。

require 'rake'

task :environment do
  puts 'task environment'
end

namespace :robots do
  task :update_robots do
    puts "task robots:update_robots"
  end
end

task cron: :environment do
  puts 'task cron'
  Rake::Task['robots:update_robots'].reenable
  Rake::Task['robots:update_robots'].invoke
end

Rake::Task['robots:update_robots'].invoke
Rake::Task[:cron].invoke

# >> robots:update_robots was invoked
# >> task robots:update_robots
# >> task environment
# >> task cron
# >> task robots:update_robots

私の最初の考えは、レーキタスクが間違っている必要があるということです(「robots:update_robots」でよろしいですか?)

再度有効にする必要があるのは私には珍しいことです。これは、必要なのがRakeではなく、単なる古いRubyであることを意味します。update_robotsタスクの内容をメソッドに移動します。このメソッドは、タスクをメソッドのように扱うのではなく、直接呼び出すことができます(タスクは依存関係を処理するためのものであり、意図的に1回だけ呼び出すため、曲げる必要があります。仕事に間違ったツールを使用し直してください)。次に、コードとrobots:update_robotsの両方が同じメソッドを呼び出すことができます。

require 'rake'

def update_robots
  puts "method update_robots"
end

task :environment do
  puts 'task environment'
end

namespace :robots do
  task :update_robots do
    update_robots
    puts "task robots:update_robots"
  end
end

task cron: :environment do
  puts 'task cron'
  update_robots
end

Rake::Task['robots:update_robots'].invoke
Rake::Task[:cron].invoke

# >> method update_robots
# >> task robots:update_robots
# >> task environment
# >> task cron
# >> method update_robots
于 2012-06-23T16:03:20.327 に答える