如果我有一个耙子可以调用多个其他耙子。
我启动父母佣金
rake myapp:main
然后在rake中调用done会为每个任务加载环境,或者只是在运行rake myapp:main
时完成一次活动?
namespace :myapp do
desc "Main Run"
task :main => :environment do
Rake::Task['myapp:task1'].invoke
Rake::Task['myapp:task2'].invoke
end
task :task1 => :environment do
# Does the first task
end
task :task2 => :environment do
# Does the second task
end
end
答案 0 :(得分:5)
向@ Shadwell的答案添加详细信息..
=> :environment
指定:environment
任务(由rails定义)是您的任务的依赖项,必须在任务完成之前调用。
您可以在此处查看:environment
任务的定义
Rake会跟踪已调用的任务,当它到达已经被调用的依赖项时,它知道它可以跳过它。
# Invoke all the prerequisites of a task.
def invoke_prerequisites(task_args, invocation_chain) # :nodoc:
if application.options.always_multitask
invoke_prerequisites_concurrently(task_args, invocation_chain)
else
prerequisite_tasks.each { |p|
prereq_args = task_args.new_scope(p.arg_names)
p.invoke_with_call_chain(prereq_args, invocation_chain)
}
end
end
Rake维护一个intance变量@already_invoked
,以了解是否已经调用了一个任务。在以下方法中可以看到相同的
def invoke_with_call_chain(task_args, invocation_chain) # :nodoc:
new_chain = InvocationChain.append(self, invocation_chain)
@lock.synchronize do
if application.options.trace
application.trace "** Invoke #{name} #{format_trace_flags}"
end
return if @already_invoked
@already_invoked = true
invoke_prerequisites(task_args, new_chain)
execute(task_args) if needed?
end
rescue Exception => ex
add_chain_to(ex, new_chain)
raise ex
end
答案 1 :(得分:2)
环境只会设置一次。
=> :environment
指定:environment
任务(由rails定义)是您的任务的依赖,必须在任务之前调用。 Rake会跟踪已调用的任务,当它到达已经被调用的依赖项时,它知道它可以跳过它。
(旁白:如果你真的希望多次调用依赖项,这可能会导致问题)
您还可以使用依赖项定义main
任务:
task :main => [:task1, :task2] do
# Blank
end
当您运行rake myapp:main
时,它会查看依赖项并调用task1
然后task2
。因为task1
具有依赖关系environment
,所以它也会首先调用它。它会跳过environment
task2
依赖{。}}。
答案 2 :(得分:0)
答案为否,从父任务执行另一个Rake任务时未加载环境。对此的简单解释是以下代码:
namespace :myapp do
desc "Main Run"
task :main => :environment do
puts "Start Time : #{Time.now.to_i}"
Rake::Task['myapp:task1'].invoke
puts "End Time1 : #{Time.now.to_i}"
Rake::Task['myapp:task2'].invoke
puts "End Time2 : #{Time.now.to_i}"
end
task :task1 => :environment do
# Does the first task
puts "Executing..1"
end
task :task2 => :environment do
# Does the second task
puts "Executing..2"
end
end
但是,执行两个或多个rake任务并不是一个好习惯。如果你想实现同样的目的,你可以模块化代码,并创建两个函数并调用函数来实现相同的结果。