Tác vụ mặc định cho không gian tên trong Rake


87

Đưa ra một cái gì đó như:

namespace :my_tasks do
  task :foo do
    do_something
  end

  task :bar do
    do_something_else
  end

  task :all => [:foo, :bar]
end

Làm thế nào để tôi đặt nó :alltrở thành tác vụ mặc định, để chạy rake my_tasksnó sẽ gọi nó (thay vì phải gọi rake my_tasks:all)?


có bạn đã cố gắng đặt một mặc định vào không gian tên (nhiệm vụ: default =>: tất cả)
Jim Deville

Làm những gì Jim mô tả, chỉ tác vụ mặc định đi ra ngoài không gian tên và phải bao gồm không gian tên và tên tác vụ. (task: default => "my_tasks: all") Xem câu trả lời của tôi bên dưới để biết ví dụ hoạt động.
Randy Eppinger

Câu trả lời:


86

Đặt nó bên ngoài không gian tên như thế này:

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"]

Ngoài ra ... nếu nhiệm vụ của bạn yêu cầu đối số thì:

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

Lưu ý cách trong ví dụ thứ 2, bạn có thể gọi nhiệm vụ cùng tên với không gian tên, tức là 'my_tasks'


4
Điều đó chỉ làm cho nó có sẵn để được gọi là rake all. Trong trường hợp này, tôi có các không gian tên khác, vì vậy điều tôi muốn là có thể gọi tác vụ my_tasks:allrake my_tasks, không phải là rake all.
Helder S Ribeiro

53
như vậy thì chỉ cần sử dụng: Nhiệm vụ: my_tasks => [ "my_tasks: foo", "my_tasks: thanh"]
Szymon Lipinski

2
Lên bình chọn cho nhận xét của Simon, tôi đã quên rằng đây là cách tôi làm điều đó.
Jim Deville

51

Không trực quan lắm, nhưng bạn có thể có một không gian tên và một nhiệm vụ có cùng tên và điều đó mang lại hiệu quả cho bạn những gì bạn muốn. Ví dụ

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

Now you can run commands like,

rake my_task:foo

and

rake my_task

3
this is great and covers all the requirements stated in the question.
Ivar

1
I think the invocation is overly complicated and it should just be task dependencies: task :my_task => ['my_task:foo', 'my_task:bar']
Alexander Presber

8

I suggest you to use this if you have lots of tasks in the namespace.

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

And then you can run all tasks in the namespace by:

rake my_tasks

With this, you don't need to worry to change your :all task when you add new tasks into that namespace.


3

I use this Rakefile for cucumber:

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"

Then if I type just:

rake

It runs the default task, which runs both fast and slow tests.

I learned this from Cheezy's blog.


3

The way I'm reading obvio171's question is that he is asking1) for a systematic way to invoke a certain task in a namespace by invoking the namespace as a task.

I've frequently encountered the same need. I like to logically group tasks into namespaces. Often that grouping resembles a hierarchy. Hence the desire to invoke the group makes very much sense to me.

Here's my take:

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)...or was asking, years ago. Nonetheless a still interesting question.


1

Add the following task outside of the namespace:

desc "Run all my tasks"
task :my_tasks => ["my_tasks:all"]

Keep in mind, that you can have a task with the same name as the namespace.

And hier a bigger example, that shows, how you can make use of tasks, which have the same name as the namespace, even when nesting namespaces:

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]

Just copy it and try it out.



0

Combining Szymon Lipiński's and Shyam Habarakada's answers, here is what I think is the most idiomatic and consise answer:

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"]

allows you to do rake my_tasks while avoiding cumbersome invocation of the subtasks.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.