1

私は基本的に、この質問の解決策を 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

したがって、 puts tsk は実際に 'test' を出力します。これは、(私が思うに!) ここでタスクを正しく見つけていることを意味します。同じコードを使用して 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)>'

印刷する場所を取得する方法はありますか?

4

1 に答える 1

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アクセスが非常に複雑でなければならない理由を誰かが説明できる場合でも、私は知りたいです!

于 2013-01-26T15:03:08.293 に答える