งานดีฟอลต์สำหรับเนมสเปซใน Rake


88

ให้สิ่งที่ชอบ:

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)


คุณลองใส่ค่าเริ่มต้นลงในเนมสเปซแล้วหรือยัง (งาน: ค่าเริ่มต้น =>: ทั้งหมด)
Jim Deville

ทำตามที่จิมอธิบายเฉพาะงานเริ่มต้นเท่านั้นที่จะอยู่นอกเนมสเปซและต้องมีเนมสเปซและชื่องาน (task: default => "my_tasks: all") ดูคำตอบของฉันด้านล่างสำหรับตัวอย่างการทำงาน
Randy Eppinger

คำตอบ:


88

วางไว้นอกเนมสเปซดังนี้:

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'


4
ที่เพียง rake allแต่ทำให้พร้อมที่จะเรียกว่าเป็น ในกรณีนี้ผมมี namespaces อื่น ๆ ดังนั้นสิ่งที่ฉันต้องการที่จะสามารถที่จะเรียกงานmy_tasks:allเป็นไม่เป็นrake my_tasks rake all
Helder S Ribeiro

53
ดังนั้นให้ใช้: task: my_tasks => ["my_tasks: foo", "my_tasks: bar"]
Szymon Lipiński

2
โหวตให้กับความคิดเห็นของ Simon ฉันลืมไปแล้วว่านี่คือวิธีการที่ฉันทำ
Jim Deville

52

ไม่ค่อยเข้าใจง่ายนัก แต่คุณสามารถมีเนมสเปซและงานที่มีชื่อเดียวกันและให้สิ่งที่คุณต้องการได้อย่างมีประสิทธิภาพ ตัวอย่างเช่น

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

3
นี่เป็นสิ่งที่ดีและครอบคลุมข้อกำหนดทั้งหมดที่ระบุไว้ในคำถาม
Ivar

1
ฉันคิดว่าการเรียกใช้นั้นซับซ้อนเกินไปและควรเป็นการพึ่งพางาน:task :my_task => ['my_task:foo', 'my_task:bar']
Alexander Presber

8

ฉันขอแนะนำให้คุณใช้สิ่งนี้หากคุณมีงานมากมายในเนมสเปซ

task :my_tasks do
  Rake.application.in_namespace(:my_tasks){|x| x.tasks.each{|t| t.invoke}}
end

จากนั้นคุณสามารถรันงานทั้งหมดในเนมสเปซโดย:

rake my_tasks

ด้วยวิธีนี้คุณไม่จำเป็นต้องกังวลที่จะเปลี่ยนงานทั้งหมดของคุณเมื่อคุณเพิ่มงานใหม่ลงในเนมสเปซนั้น


3

ฉันใช้ 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


3

วิธีที่ฉันอ่านคำถามของ 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) ... หรือถามเมื่อหลายปีก่อน อย่างไรก็ตามยังคงเป็นคำถามที่น่าสนใจ


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]

เพียงแค่คัดลอกและทดลองใช้


0

ขึ้นอยู่กับโซลูชันของ Rocky งานเริ่มต้นสำหรับเนมสเปซใน Rake

และคำตอบของ dexter นี้มีวิธีที่จะทราบงานคราดปัจจุบันหรือไม่?

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

0

เมื่อรวมคำตอบของ Szymon Lipiń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ในขณะที่หลีกเลี่ยงการเรียกใช้งานย่อยที่ยุ่งยาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.