2016-07-29 12 views
3

私はメインレイクタスクsetup_a_new_set_of_snippets.rakeを持っています。それは他のタスクを呼び出します。だから、主なものは次のようになります。何らかの理由で、このように実行されるfetch_and_create_snippetsレーキについてはこのレーキタスクはなぜ2回実行されますか?

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 

Rake::Task["fetch_and_create_snippets"].invoke(repo,path,entry_id,framework_id,method_name)は二度実行しているようです。

fetch_and_create_snippetsの最初の実行から正常に実行されたイベントの最初のバッチを::

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 

これは、コンソールへの出力は次のようになります。

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 
fetch_and_create_snippets.rake - ここ

は、そのタスクがあります

それを再実行して、EXISTS出力を示します。この出力は、スニペットが存在する場合にのみ出力されます。

0/786 - EXISTS - [email protected] - c91b5d3fe3d263963eb3f9ef2ec0dc0074951064 
1/786 - EXISTS - [email protected] - 3729e22e6423348aa9282cd17b49c09793ca3a6f 
2/786 - EXISTS - [email protected] - ec9b073c185dcef26bd3293ac124fee8285de103 
3/786 - EXISTS - [email protected] - 5a973fa8019962133449c073c4e8b5cf2ce8fb36 
4/786 - EXISTS - [email protected] - fe440fccc7398d2cd0b4f04f700c62cc76ba2b0a 
5/786 - EXISTS - [email protected] - 2fbecb7d0447b70b30b71addfbc97608690b4106 
6/786 - EXISTS - [email protected] - 77d17fc9757bcbbc63267c2e408b4dbe8ab5d930 
7/786 - EXISTS - [email protected] - ef35d80523fd066ae1d836658ef840dd0da93849 
8/786 - EXISTS - [email protected] - e13fe33b857c7f608590bf80030f8c837a15faea 
9/786 - EXISTS - [email protected] - 03c8b4c97be4ffaf1f84daf657915d8953219476 

これは最初と同じバッチで実行されます。

このダブルランの原因は何ですか?

答えて

6

loadのメソッドを削除してください。
Railsプロジェクトでは、すべて*.rake内のファイルがlib/tasksディレクトリに自動的に読み込まれます。したがって、これらのタスクはすべてloadなしで利用できるようになります。

は、.rakeに例のlib /タスク/ capistrano.rakeため を終了するのlib /タスクに置かれたファイルには、独自のタスクを追加し、彼らは意志のようなあなたのRakefileあなたが最初に生成見ることができますコメントで

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 './lib/tasks/foo.rake' 
desc 'bar task' 
task :bar do 
    puts 'call bar task' 
    Rake::Task['foo'].invoke 
end 

fooタスクにloadを追加する場合は二回呼び出されます。

# => call bar task 
# => call foo task 
# => call foo task 
関連する問題