다음과 같이 주어집니다.
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