Tugas default untuk namespace di Rake

88

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 :alltugas default, sehingga menjalankan rake my_tasksakan memanggilnya (daripada harus menelepon rake my_tasks:all)?

Helder S Ribeiro
sumber
sudahkah Anda mencoba menempatkan default ke namespace (task: default =>: all)
Jim Deville
Lakukan apa yang dijelaskan Jim, hanya tugas default yang berada di luar namespace dan harus menyertakan namespace dan nama tugas. (task: default => "my_tasks: all") Lihat jawaban saya di bawah ini untuk contoh kerja.
Randy Eppinger

Jawaban:

88

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'

Szymon Lipiński
sumber
4
Itu hanya membuatnya tersedia untuk disebut sebagai rake all. Dalam hal ini, saya memiliki ruang nama lain, jadi yang saya inginkan adalah dapat memanggil tugas my_tasks:allsebagai rake my_tasks, bukan sebagai rake all.
Helder S Ribeiro
53
jadi gunakan saja: task: my_tasks => ["my_tasks: foo", "my_tasks: bar"]
Szymon Lipiński
2
Up memilih untuk komentar Simon, saya lupa bahwa ini adalah cara saya melakukannya.
Jim Deville
52

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

rake my_task
Shyam Habarakada
sumber
3
ini bagus dan mencakup semua persyaratan yang disebutkan dalam pertanyaan.
Ivar
1
Saya pikir permintaan itu terlalu rumit dan seharusnya hanya ketergantungan tugas:task :my_task => ['my_task:foo', 'my_task:bar']
Alexander Presber
8

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:

rake my_tasks

Dengan ini, Anda tidak perlu khawatir untuk mengubah: semua tugas Anda saat menambahkan tugas baru ke namespace itu.

Rocky
sumber
3

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:

rake

Ini menjalankan tugas default, yang menjalankan tes cepat dan lambat.

Saya belajar ini dari blog Cheezy .

Randy Eppinger
sumber
3

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.

zor-el
sumber
1

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.

tvw
sumber
0

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_taskssambil menghindari pemanggilan subtugas yang rumit.

Alexander Presber
sumber