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


87

다음과 같이 주어집니다.

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이 설명하는대로 수행하십시오. 기본 태스크 만 네임 스페이스 외부로 이동하며 네임 스페이스 및 태스크 이름을 포함해야합니다. (task : default => "my_tasks : all") 작업 예제는 아래 내 대답을 참조하십시오.
Randy Eppinger 2013 년

답변:


86

다음과 같이 네임 스페이스 외부에 배치합니다.

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')으로 작업을 호출 할 수있는 방법에 유의하십시오.


4
그것은 단지 rake all. 내가 원하는 것은 작업을 호출 할 수있다이 경우에, 나는, 다른 네임 스페이스를 my_tasks:all같이 rake my_tasks하지, rake all.
Helder S Ribeiro

53
그럼 바로 사용 : 작업 : my_tasks => [ "my_tasks : foo는", "my_tasks : 바"]
인 Szymon 리핀 스키

2
사이먼의 의견에 찬성 투표를했지만 이것이 내가하는 방식이라는 것을 잊었습니다.
Jim Deville

51

별로 직관적이지는 않지만 이름이 같고 원하는 것을 효과적으로 제공하는 네임 스페이스와 작업을 가질 수 있습니다. 예를 들어

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 2014 년

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

이렇게하면 해당 네임 스페이스에 새 작업을 추가 할 때 : all 작업을 변경하는 것에 대해 걱정할 필요가 없습니다.


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

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.