[ruby] 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

빠른 테스트와 느린 테스트를 모두 실행하는 기본 작업을 실행합니다.

내가 배운 에서 Cheezy의 블로그 .


답변

내가 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) … 또는 몇 년 전에 물었습니다. 그럼에도 불구하고 여전히 흥미로운 질문입니다.


답변

네임 스페이스 외부에 다음 작업을 추가합니다.

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]

복사하여 사용해보십시오.


답변

Rocky의 솔루션을 기반으로 Rake의 네임 스페이스에 대한 기본 작업

그리고이 덱스터의 대답 현재 레이크 작업을 알 수있는 방법이 있습니까?

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