30

タスクに次のようなパラメーターと依存関係タスクがある例を見てきました。

task :name, [:first_name, :last_name] => [:pre_name] do |t, args|
  args.with_defaults(:first_name => "John", :last_name => "Dough")
  puts "First name is #{args.first_name}"
  puts "Last name is #{args.last_name}"
end

次のようなタスクの依存関係である場合、名前のタスクにパラメーターを渡すにはどうすればよいでしょうか。

task :sendLetter => :name
  #do something
end
4

2 に答える 2

33

引数はコール スタックを介して渡されます。トップレベルのタスクがすべての依存関係に必要なすべての引数をキャプチャすることを確認する必要があるだけです。あなたの場合、タスクを実行したいfirst_nameと思うでしょう。last_namesend_letter

次の例は、他の場所で定義された名前付き引数が依存関係に流れ込む (依存関係で定義されていなくても) ことを示していますが、最上位のタスク引数の名前と一致しない引数は nil です。

desc 'Bar'
task :bar, :nom do |task, args|
  puts "BAR NOM: #{args[:nom]}"
  puts "BAR NAME: #{args[:name]}"
end

desc 'Foo'
task :foo, [:name] => :bar do |task, args|
  puts "FOO NAME: #{args[:name]}"
end

ランニングrake foo[baz]イールド

BAR NOM: 
BAR NAME: baz
FOO NAME: baz

args.with_defaults(nom: 'Jaques')タスクで使用してfooも、依存するタスクには影響がないことに注意してください。これnomはまだ nil です。

レーキバージョン:rake, version 10.0.3

ルビーのバージョン:ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]

于 2013-02-13T22:31:38.507 に答える
9

あなたがおそらく得ようとしている最も近いものは、

task :sendLetter do
  task(:name).invoke("first", "last")
end

また

task :sendLetter do
  task(:name).execute(["first", "last"])
end

次のようなことができます

task :sendLetter => task(:name).invoke("first", "last")

しかし、それはnameあなたが求めるかどうかに関係なく呼び出されますsendLetter

Task#invokeタスクが呼び出されていない場合にのみタスクを呼び出し、呼び出されていない前提条件を最初に呼び出します。Task#execute常にタスクを呼び出しますが、前提条件は呼び出しません。パラメータは の 1 回呼び出しの性質には影響しないことに注意してください。Task#invokeパラメータ化されたタスクを 2 回呼び出すと、パラメータが異なるかどうかに関係なく、1 回だけ実行されます。

于 2011-07-10T17:20:52.370 に答える