在rake任务中调用具有多个任务的多个rake任务

时间:2019-08-15 22:47:09

标签: ruby-on-rails ruby rake rake-task rakefile

我有一个关于耙multitask的问题。我遇到了这些答案,这些使我开始Question 1 Question 2。我只是想确保我不会丢失某些东西,因为我无法使它正常工作。我有任务import:locations,它只是调用其他任务的包装。

namespace :import do
  desc "import locations"
  task :locations, [:context] => :environment do |t, args|

    # Used for printing if tasks fail
    if !args[:context].nil?
      args[:context][:task] = 'IMPORTING_LOCATIONS'
    end

    locs = LocationCSV.load_locations # Parse locations once

    Rake::Task["locations:branches"].invoke(args[:context], locs)
    Rake::Task["locations:venues"].invoke(args[:context], locs)

    Uploader.slack_text("Finished import:locations.")

  end
end

看来我可以使用multitask来并行运行这两个任务。问题是我无法正确调用语法。

Rake::MultiTask['locations:branches','locations:venues'].(args[:context], locs)

我有点迷茫,因为我试图将解析的位置传递到每个任务中(它只是位置和位置匹配的详细位置的哈希值)。是否可以通过这种方式调用这两个任务?我想念什么?在其他rake任务中被调用时,正确的multitask语法是什么?

我的主要任务如下:

namespace :import do
  desc "import all data"
  task :locations, [:context] => :environment do |t, args|


    Rake::Task["import:customers"].invoke
    Rake::Task["import:locations"].invoke # where I want the multitask above to occur

    Uploader.slack_text("Finished the import.")

  end
end

关于如何运行这些任务的其他建议(无论是否同时进行)将不胜感激。以及您在这种情况下对最佳实践的任何指导(经验或阅读资源)将大有帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您想坚持使用rake的惯用语,则可以尝试以下方法:

示例:

namespace :namespace do
  desc "Example description."
  task :task, [:param] => :environment do |t, args|
    puts args[:param]
    ...
  end
end

1。。这始终执行任务,但不执行其依赖项:

Rake::Task['namespace:task'].execute

2。。这将执行依赖关系,但仅在尚未被调用的情况下才执行任务:

Rake::Task['namespace:task'].invoke

3。。这首先会重置任务的has_invoked状态,然后可以再次执行任务,依赖项和所有任务:

Rake::Task['namespace:task'].reenable
Rake::Task['namespace:task'].invoke

您可以使用Rake::Task['namespace:task'].invokeRake::Task['namespace:task'].execute在加载的Rails环境中执行rake任务

因此,在以上总结之后,我认为您可以尝试执行方法。像下面这样,做任何你想做的事。

Rake::Task['namespace:task'].execute(your_argument)

有关更多信息:https://medium.com/@sampatbadhe/rake-task-invoke-or-execute-419cd689c3bd

希望这会对您有所帮助:)