Programing

Rake의 네임 스페이스에 대한 기본 작업

lottogame 2020. 9. 21. 22:18
반응형

Rake의 네임 스페이스에 대한 기본 작업


다음과 같이 주어집니다.

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

두 번째 예제에서 네임 스페이스와 동일한 이름 (예 : '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

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

I learned this from Cheezy's blog.


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. Let me know what you think.

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.


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.


Based on Rocky's solution Default task for namespace in Rake

And this dexter's answer Is there a way to know the current rake task?

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

참고URL : https://stackoverflow.com/questions/1579231/default-task-for-namespace-in-rake

반응형