ruby-on-rails - 是否从父 rake 加载环境中为每个任务调用多个任务

标签 ruby-on-rails ruby ruby-on-rails-3.2 rake rake-task

如果我有一个调用多个其他 rake 的 rake 。

一旦我启动父级抽成

rake myapp:main

然后在 rake 中完成的调用将为每个任务加载环境,或者在运行 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

最佳答案

为@Shadwell 的回答添加详细信息..

=> :environment 指定 :environment 任务(由 Rails 定义)是您的任务的依赖项,必须在您的任务执行之前调用。

你可以在这里看到:environment任务的定义

https://github.com/rails/rails/blob/d70ba48c4dd6b57d8f38612ea95a3842337c1419/railties/lib/rails/application.rb#L428-432

Rake 跟踪调用了哪些任务,当它到达一个已经被调用的依赖时,它知道它可以跳过它。

https://github.com/jimweirich/rake/blob/5e59bccecaf480d1de565ab34fd15e54ff667660/lib/rake/task.rb#L195-204

# 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 维护一个实例变量@already_invoked 以了解任务是否已经被调用。同样可以在下面的方法中看到

https://github.com/jimweirich/rake/blob/5e59bccecaf480d1de565ab34fd15e54ff667660/lib/rake/task.rb#L170-184

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

关于ruby-on-rails - 是否从父 rake 加载环境中为每个任务调用多个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25280370/

相关文章:

ruby - 命名空间如何在 Ruby 中工作?

ruby-on-rails - 按父属性对子项进行分组

mysql - `socket` 声明在 Rails 应用程序的 database.yml 文件中有什么作用?

ruby-on-rails - 创建动态集合选择rails 3.1

javascript - 简单的 javascript 在 Shopify 中不起作用

ruby-on-rails - 如何更改设备的闪存[ :notice] in rails

ruby-on-rails - Ruby elasticsearch-model-配置多个映射

ruby-on-rails - Rails - 每个请求的数据库连接,基于用户凭据

ruby-on-rails - 更新另一个 gem 依赖项中指定的 gem 版本

mysql - rake 数据库 :multi:migrate DATABASE=configuration error with JRuby, mysql,riak