Diberikan sesuatu seperti:
namespace :my_tasks do
task :foo do
do_something
end
task :bar do
do_something_else
end
task :all => [:foo, :bar]
end
Bagaimana cara menjadikan :all
tugas default, sehingga menjalankan rake my_tasks
akan memanggilnya (daripada harus menelepon rake my_tasks:all
)?
Jawaban:
Letakkan di luar namespace seperti ini:
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"]
Juga ... jika tugas Anda memerlukan argumen, maka:
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
Perhatikan bagaimana pada contoh ke-2 Anda dapat memanggil tugas dengan nama yang sama dengan namespace, yaitu 'my_tasks'
sumber
rake all
. Dalam hal ini, saya memiliki ruang nama lain, jadi yang saya inginkan adalah dapat memanggil tugasmy_tasks:all
sebagairake my_tasks
, bukan sebagairake all
.Tidak terlalu intuitif, tetapi Anda dapat memiliki namespace dan tugas yang memiliki nama yang sama, dan itu secara efektif memberi Anda apa yang Anda inginkan. Misalnya
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
Sekarang Anda dapat menjalankan perintah seperti,
rake my_task:foo
dan
sumber
task :my_task => ['my_task:foo', 'my_task:bar']
Saya menyarankan Anda untuk menggunakan ini jika Anda memiliki banyak tugas di namespace.
task :my_tasks do Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}} end
Dan kemudian Anda dapat menjalankan semua tugas di namespace dengan:
Dengan ini, Anda tidak perlu khawatir untuk mengubah: semua tugas Anda saat menambahkan tugas baru ke namespace itu.
sumber
Saya menggunakan Rakefile ini untuk mentimun:
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"
Lalu jika saya mengetik saja:
Ini menjalankan tugas default, yang menjalankan tes cepat dan lambat.
Saya belajar ini dari blog Cheezy .
sumber
Cara saya membaca pertanyaan obvio171 adalah bahwa dia menanyakan 1) cara sistematis untuk menjalankan tugas tertentu dalam namespace dengan menggunakan namespace sebagai tugas.
Saya sering menjumpai kebutuhan yang sama. Saya suka mengelompokkan tugas secara logis ke dalam ruang nama. Seringkali pengelompokan itu menyerupai hierarki. Oleh karena itu, keinginan untuk memanggil grup sangat masuk akal bagi saya.
Ini pendapat saya:
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) ... atau bertanya, bertahun-tahun yang lalu. Meski demikian pertanyaan yang masih menarik.
sumber
Tambahkan tugas berikut di luar namespace:
desc "Run all my tasks" task :my_tasks => ["my_tasks:all"]
Perlu diingat, bahwa Anda dapat memiliki tugas dengan nama yang sama dengan namespace.
Dan beri contoh yang lebih besar, yang menunjukkan, bagaimana Anda dapat menggunakan tugas, yang memiliki nama yang sama dengan namespace, bahkan saat menumpuk namespace:
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]
Cukup salin dan coba.
sumber
Berdasarkan solusi Rocky Tugas default untuk namespace di Rake
Dan jawaban cekatan ini Adakah cara untuk mengetahui tugas menyapu saat ini?
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
sumber
Menggabungkan jawaban Szymon Lipiński dan Shyam Habarakada, inilah yang menurut saya merupakan jawaban yang paling idiomatis dan tepat:
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"]
memungkinkan Anda melakukannya
rake my_tasks
sambil menghindari pemanggilan subtugas yang rumit.sumber