簡體   English   中英

為什么這個rake任務會運行兩次?

[英]Why does this rake task run twice?

我有一個主要的rake任務setup_a_new_set_of_snippets.rake我打電話,然后調用其他任務。 所以主要看起來像這樣:

load './lib/tasks/fetch_and_create_snippets.rake'
load './lib/tasks/generate_diffs_for_snippets.rake'
load './lib/tasks/cleanup_snippets_with_empty_diffs.rake'

desc "Setup a new set of Snippets"
task :setup_a_new_set_of_snippets, [:repo, :path, :entry_id, :framework_id, :method_name] => :environment do |task, args|
  repo = args[:repo]
  path = args[:path]
  entry_id = args[:entry_id]
  framework_id = args[:framework_id]
  method_name = args[:method_name]
  Rake::Task["fetch_and_create_snippets"].invoke(repo,path,entry_id,framework_id,method_name)
  Rake::Task["generate_diffs_for_snippets"].invoke
  Rake::Task["cleanup_snippets_with_empty_diffs"].invoke(framework_id)
end

出於某種原因, fetch_and_create_snippets rake運行如下: Rake::Task["fetch_and_create_snippets"].invoke(repo,path,entry_id,framework_id,method_name)似乎運行了兩次。

這是任務fetch_and_create_snippets.rake

desc 'Fetch and Create Snippets from Github'

task :fetch_and_create_snippets, [:repo, :path, :entry_id, :framework_id, :method_name] => :environment do |task, args|
  repo = args[:repo]
  path = args[:path]
  entry_id = args[:entry_id]
  framework_id = args[:framework_id]
  method_name = args[:method_name]
  client = Octokit.client
  commits = GetCommits.new(repo, path).all
  commits_count = commits.count
  commits.each_with_index do |commit, index|
    content = client.contents(repo, path: path, ref: commit.sha)
    if Snippet.exists?(gh_sha: content.sha)
      puts "#{index}/#{commits_count} - EXISTS - #{commit.commit.author.email} - #{content.sha}".blue
    elsif commit.author.nil?
      puts "#{index}/#{commits_count} - NO AUTHOR - #{commit.commit.author.email} - #{content.sha}".magenta
    else
      create_snippet = CreateSnippet.new(repo, path, entry_id, framework_id, commit, method_name)
      if create_snippet
        puts "#{index}/#{commits_count} - #{commit.author.login} - #{commit.sha} SUCCESSFULLY CREATED".green
      else
        puts "#{index}/#{commits_count} - #{commit.author.login} - #{commit.sha} - NOT SUCCESSFULLY CREATED - #{create_snippet.errors}".red
      end
    end
  end
end

這是控制台的輸出結果:

第一批fetch_and_create_snippets第一批成功運行的事件:

783/786 - dhh - ac3c8a54f83418b5cac4b093fc1bae29f59f3a1f SUCCESSFULLY CREATED
Snippet ID: 2974 SUCCESSFULLY SANITIZED
784/786 - dhh - 7022dd9c05064ef914f8836fb5e8b2d2ee3c02ed SUCCESSFULLY CREATED
Snippet ID: 2975 SUCCESSFULLY SANITIZED
785/786 - dhh - db045dbbf60b53dbe013ef25554fd013baf88134 SUCCESSFULLY CREATED

然后它重新運行它並顯示EXISTS輸出,只有在Snippet存在時才會輸出。

0/786 - EXISTS - acme@test.com - c91b5d3fe3d263963eb3f9ef2ec0dc0074951064
1/786 - EXISTS - acme@test.com - 3729e22e6423348aa9282cd17b49c09793ca3a6f
2/786 - EXISTS - acme@test.com - ec9b073c185dcef26bd3293ac124fee8285de103
3/786 - EXISTS - acme@test.com - 5a973fa8019962133449c073c4e8b5cf2ce8fb36
4/786 - EXISTS - acme@test.com - fe440fccc7398d2cd0b4f04f700c62cc76ba2b0a
5/786 - EXISTS - acme@test.com - 2fbecb7d0447b70b30b71addfbc97608690b4106
6/786 - EXISTS - acme@test.com - 77d17fc9757bcbbc63267c2e408b4dbe8ab5d930
7/786 - EXISTS - acme@test.com - ef35d80523fd066ae1d836658ef840dd0da93849
8/786 - EXISTS - acme@test.com - e13fe33b857c7f608590bf80030f8c837a15faea
9/786 - EXISTS - acme@test.com - 03c8b4c97be4ffaf1f84daf657915d8953219476

這是第一次完成的同一批次。

什么可能導致這種雙重運行?

嘗試刪除load方法。
在Rails項目中,自動加載lib/tasks目錄中的所有*.rake文件。 所以這些任務都可以在沒有額外load情況load

在您的Rakefile您可以看到最初生成的評論

在以.rake結尾的lib / tasks中放置的文件中添加您自己的任務,例如lib / tasks / capistrano.rake,它們將自動可用於Rake。

我創建了簡單的.rake文件。

# lib/tasks/foo.rake

desc 'foo task'
task :foo do
  puts 'call foo task'
end

# lib/tasks/bar.rake

desc 'bar task'
task :bar do
  puts 'call bar task'
  Rake::Task['foo'].invoke
end

它工作得很好。 輸出是

# => call bar task
# => call foo task

但是如果我在bar.rake添加load

load './lib/tasks/foo.rake'
desc 'bar task'
task :bar do
  puts 'call bar task'
  Rake::Task['foo'].invoke
end

foo任務將被調用兩次。

# => call bar task
# => call foo task
# => call foo task

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM