次のようなものを考えます:
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」と呼ぶ方法に注意してください。
あまり直感的ではありませんが、同じ名前の名前空間とタスクを設定できます。これにより、必要なものを効率的に得ることができます。例えば
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_tasks do
Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end
そして、次の方法でネームスペース内のすべてのタスクを実行できます。
rake my_tasks
これにより、名前空間に新しいタスクを追加するときに:allタスクを変更する必要はありません。
私はキュウリにこの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
これは、高速テストと低速テストの両方を実行するデフォルトタスクを実行します。
this から 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