次のようなものが与えられた:
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
task :all => [:foo, :bar]
end
どのようにし:all
てデフォルトのタスクにして、実行rake my_tasks
することでそれを呼び出すことができrake my_tasks:all
ますか?
次のようなものが与えられた:
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
task :all => [:foo, :bar]
end
どのようにし:all
てデフォルトのタスクにして、実行rake my_tasks
することでそれを呼び出すことができrake my_tasks:all
ますか?
回答:
次のように名前空間の外側に配置します。
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
end
task :all => ["my_tasks:foo", "my_tasks:bar"]
また...タスクに引数が必要な場合:
namespace :my_tasks do
task :foo, :arg1, :arg2 do |t, args|
do_something
end
task :bar, :arg1, :arg2 do |t, args|
do_something_else
end
end
task :my_tasks, :arg1, :arg2 do |t, args|
Rake::Task["my_tasks:foo"].invoke( args.arg1, args.arg2 )
Rake::Task["my_tasks:bar"].invoke( args.arg1, args.arg2 )
end
2番目の例では、タスクに名前空間と同じ名前、つまり「my_tasks」を呼び出す方法に注意してください。
rake all
です。この場合、私は他の名前空間を持っているので、タスクをmy_tasks:all
としてrake my_tasks
ではなくとして呼び出すことができるようにしたいのですrake all
。
あまり直感的ではありませんが、同じ名前の名前空間とタスクを使用でき、それによって事実上、必要なものが得られます。例えば
namespace :my_task do
task :foo do
do_foo
end
task :bar do
do_bar
end
end
task :my_task do
Rake::Task['my_task:foo'].invoke
Rake::Task['my_task:bar'].invoke
end
これで、次のようなコマンドを実行できます。
rake my_task:foo
そして
rake my_task
task :my_task => ['my_task:foo', 'my_task:bar']
私はこのRakefileをキュウリに使用します:
require 'cucumber'
require 'cucumber/rake/task'
namespace :features do
Cucumber::Rake::Task.new(:fast) do |t|
t.profile = 'fast'
end
Cucumber::Rake::Task.new(:slow) do |t|
t.profile = 'slow'
end
task :ci => [:fast, :slow]
end
task :default => "features:ci"
それから私がちょうどタイプすると:
rake
デフォルトのタスクが実行され、高速テストと低速テストの両方が実行されます。
これはCheezyのブログで学びました。
私がobvio171の質問を読んでいる方法は、彼が1)名前空間をタスクとして呼び出すことによって名前空間の特定のタスクを呼び出す体系的な方法を求めているということです。
私は同じニーズに頻繁に遭遇しました。タスクを名前空間に論理的にグループ化するのが好きです。多くの場合、そのグループは階層に似ています。したがって、グループを呼び出すという欲求は、私には非常に理にかなっています。
これが私の見解です。
module Rake::DSL
def group(name, &block)
ns = namespace name, &block
default = ns[:default]
task name => "#{name}:default" if default
ns
end
end
group :foo do
task :foo1 do |t| puts t.name end
task :foo2 do |t| puts t.name end
task :default => [:foo1, :foo2]
end
task :default => :foo
1) ...または何年も前に尋ねていました。それでもなお興味深い質問です。
名前空間の外に次のタスクを追加します。
desc "Run all my tasks"
task :my_tasks => ["my_tasks:all"]
名前空間と同じ名前のタスクを作成できることに注意してください。
さらに大きな例として、名前空間をネストしている場合でも、名前空間と同じ名前のタスクをどのように利用できるかを示します。
namespace :job1 do
task :do_something1 do
puts "job1:do_something1"
end
task :do_something2 do
puts "job1:do_something2"
end
task :all => [:do_something1, :do_something2]
end
desc "Job 1"
task :job1 => ["job1:all"]
# You do not need the "all"-task, but it might be handier to have one.
namespace :job2 do
task :do_something1 do
puts "job2:do_something1"
end
task :do_something2 do
puts "job2:do_something2"
end
end
desc "Job 2"
task :job2 => ["job2:do_something1", "job2:do_something2"]
namespace :superjob do
namespace :job1 do
task :do_something1 do
puts "superjob:job1:do_something1"
end
task :do_something2 do
puts "superjob:job1:do_something2"
end
end
desc "Job 1 in Superjob"
task :job1 => ["job1:do_something1", "job1:do_something2"]
namespace :job2 do
task :do_something1 do
puts "superjob:job2:do_something1"
end
task :do_something2 do
puts "superjob:job2:do_something2"
end
end
desc "Job 2 in Superjob"
task :job2 => ["job2:do_something1", "job2:do_something2"]
end
desc "My Super Job"
task :superjob => ["superjob:job1", "superjob:job2"]
# Do them all just by calling "$ rake"
task :default => [:job1, :job2, :superjob]
コピーして試してみてください。
Rockyのソリューションに基づくRakeの名前空間のデフォルトタスク
そして、このデクスターの答え現在のレーキタスクを知る方法はありますか?
namespace :root do
namespace :foo do
end
namespace :target do
task :all do |task_all|
Rake.application.in_namespace(task_all.scope.path) do |ns|
ns.tasks.each { |task| task.invoke unless task.name == task_all.name }
end
end
task :one do
end
task :another do
end
end
end
SzymonLipińskiの回答とShyam Habarakadaの回答を組み合わせると、最も慣用的で簡潔な回答は次のとおりです。
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
end
task :my_tasks => ["my_tasks:foo", "my_tasks:bar"]
rake my_tasks
サブタスクの面倒な呼び出しを回避しながら実行できます。