2013-01-24 56 views
1

我基本上是試圖解決這個問題轉換成耙子任務:How do I find the source file for a rake task?如何從rake任務找到另一個rake任務的文件系統位置?

我要輸入,例如:

rake meta:where[test] 

並獲得其中的測試任務是定義該路徑。這是我有,有一些不必要的東西,所以我可以做一些相關評論:

Rake::TaskManager.record_task_metadata=true 

namespace :meta do 
    desc "meta:where[taskname] - where is taskname defined?" 
    task :where, [:taskname] do |t, args| 
    tsk = Rake.application.tasks.each.find {|t| t.name == args.taskname} 
    puts tsk 
    tsk.locations.each {|x| puts x} 
    end 
end 

所以,把嘖實際輸出「測試」,這意味着(我想!)我在正確的位置定位的任務。使用相同的代碼從rails控制檯打印路徑並不麻煩(如上面提到的SO帖子)。它說的是這樣的:

/Users/me/.rvm/gems/ruby-1.9.3-p362/gems/railties-3.2.11/lib/rails/test_unit/testing.rake:49:in `<top (required)>' 

任何想法如何我可以得到的位置(s)打印?

+0

神祕的是,鏈接問題中的代碼被改變了,現在它適用於我的耙子任務... –

回答

2

如上所述,來自鏈接問題的代碼起作用,例如,

namespace :meta do 
    desc "meta:where[taskname] - where is taskname defined?" 
    task :where, [:taskname] do |t, args| 
    puts "looking for #{args.taskname}" 
    tsk = Rake.application[args.taskname] 
    # It is mysterious to me why this would need to be so complicated 
    puts tsk.actions.map(&:source_location) 
    end 
end 

但如果任何人都可以解釋爲什麼在這個問題上面的代碼不工作,或者爲什麼source_locations訪問有這麼複雜,我還是很想知道!