2012-06-23 79 views
2

我試圖創建一個Rake任務來調用其他兩個Rake任務。我發現有相關問題的人herehere,但它不是很有用。這是我迄今拼湊在一起的東西。任何想法我做錯了什麼?Rails應用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工作。但是我已經評論了我不需要的東西,所以我可以測試它的工作原理。

我不斷收到此錯誤:

Don't know how to build task 'robots:update_robots'

但我不知道爲什麼。

更新:所以我原來不能運行被我的cron rake任務調用的原始任務。我讓它運行了一段時間,沿線購買,我在「更新」中刪除了「d」。所以這個命令 Rake :: Task [「robots:upate_robots」]。執行 並不是因爲機器人rake任務是「upate」而不是「update」。

Tl; dr:錯別字。

回答

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 

我首先想到的是,你必須有rake任務錯誤(你肯定這是?「機器人:update_robots」)

這是對我來說不尋常的是,你需要重新啓用它,這意味着你想要的不是Rake,而是普通的舊Ruby。將update_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 
+1

+ 1這樣的:需要「耙」 - 沒有一個教程提到。如果你知道的話,我覺得很明顯:) – Will

相關問題