Rubyでのタスク構築ツールrakeの入門学習チュートリアル

8192 ワード

Rakeの概要
RakeはRuby Makeという意味で、rubyで開発されたコード構築ツールです.
でも、なぜルビーにレイクが必要なの?
Rubyコードはコンパイルする必要はありません.Rakeは必要ないのではないでしょうか.Rakeには別の利点がありました.Rakeをタスク管理ツールとして使用しました.これには2つのメリットがあります.
1.タスクによるスクリプトの作成と実行
もちろん、スクリプトを使用して、自動的に実行するタスクを作成することができます.しかし、大規模なアプリケーションでは、Railsのdb:migrateタスクなどのデータベース移行、キャッシュのクリア、コードメンテナンスなどのスクリプトを作成する必要があります.各タスクについて、いくつかのスクリプトを書く必要がある場合があります.これにより、管理が複雑になります.では、それらをタスクで整理すると、管理が楽になります.
2.タスク間の依存関係の追跡と管理
Rakeはまた、タスク間の依存を容易に管理する方法を提供した.例えば、「migrate」タスクと「schema:dump」タスクの両方が「connect_to_database」タスクに依存する場合、「migrate」タスクが呼び出される前に「connect_to_database」タスクが実行する.
次に、Rakeでタスクスクリプトを作成する方法について説明します.
シーヶンスエグゼクティブ
Rakeでタスクを定義すると、タスクの実行順序を指定できます.たとえば、毎朝起きた後の通常の作業:1.目覚まし時計を閉じる2.身なりを整えるコーヒーを入れる.犬の散歩の上のいくつかのものは、Rakefileでこのように説明されています.
 

 task :turn_off_alarm do
  puts "Turned off alarm. Would have liked 5 more minutes, though."
 end

 task :groom_myself do
  puts "Brushed teeth."
  puts "Showered."
  puts "Shaved."
 end

 task :make_coffee do
  cups = ENV["COFFEE_CUPS"] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
 end

 task :walk_dog do
  puts "Dog walked."
 end

 task :ready_for_the_day => [:turn_off_alarm, :groom_myself, :make_coffee, :walk_dog] do
  puts "Ready for the day!"
 end


レイクでfor_the_dayがタスクを実行すると、すべてのtaskが予定された順序で実行されていることがわかります.

 Turned off alarm. Would have liked 5 more minutes, though.
 Brushed teeth.
 Showered.
 Shaved.
 Made 5 cups of coffee. Shakes are gone.
 Dog walked.
 Ready for the day!


またrake make_を使用することもできますcoffee COFFEE_CUPS=5は、コマンドで変数に値を割り当てます.
ネーミングスペース
上のようにタスクを定義するのは問題ありませんが、仕事関連、交通関連など、他のものを定義する必要がある場合は、すべてのタスクが混ざっているのは明らかに適切ではありません.結局、上のタスクは私たちが起きた定番のもので、他のものとは関係ありません.
namespaceによりRailsにおけるrake db:migrateのようなタスクを定義し,事故物間の明確な境界を描き,上のタスクをnamespaceのコードブロックに以下のように含めることができる.

 namespace :morning do
  task :turn_of_alarm
  ....
 end

今回の呼び出しコマンドは少し変更する必要があります.rake COFFEE_CUPS=3 morning:ready_for_the_day. railsのrakeタスク呼び出し方式に似ていますか?
デフォルトTask
上記の設定があれば、詳細なタスク名を忘れたり書きたくない場合は、rakeを直接実行するとどのような効果がありますか?結果はrake abortedです!、タスクが中断されたエラー.このような可能性がある以上、defaultのデフォルトタスクを設定することで、次のようにします.

 task :default => 'morning:turn_off_alarm'


rakeコマンドを直接実行すると、デフォルトの操作が実行され、目覚まし時計を閉じてくれます.
あなたのTaskを説明します
タスクがだんだん多くなると、管理の問題が明らかになります.ネーミングスペースのほかに、ドキュメントクラスのサポートが必要です.タスクを整理し、各タスクの目的と機能を教えてくれます.descでタスクを説明してみてください.

 ...
 desc "Make coffee"
 task :make_coffee do
  cups = ENV["COFFEE_CUPS"] || 2
  puts "Made #{cups} cups of coffee. Shakes are gone."
 end
 ...


上記の説明は、ドキュメント内で表示するだけでなく、rake-Tを使用しても、各タスクが何をしているのかを洗浄することができます.rake-Tの出力結果はアルファベット順である.

 rake morning:make_coffee    # Make coffee


Taskを呼び出す
Rakeはまた、次のコードのように、異なるタスクの間で相互に呼び出すことができます.午後もコーヒーを飲みたいと思っています.定義を繰り返す必要はありません.午前中の泡法を直接使って、一杯ください.

namespace :afternoon do
  task :make_coffee do
   Rake::Task['morning:make_coffee'].invoke
   puts "Ready for the rest of the day!"
  end
 end


Rakeスクリプト作成
簡単な例を次に示します.
もしあなたが火星のメンバーで、古いバージョンのあれら、つまりツバメの虎が走るなど、週末に車の向こうに鍋を打って、それから集団PCに行くつもりです.この場合、車に乗って車を探したり、魚を焼いたり、ネットカフェPCを作ったりする3つのタスクを自分で作成する必要があります.vimでrakefileというファイルを作成します(注釈:Rakeは現在のパスの下でRakefile、rakefile、RakeFile.rb、rakefile.rbというrakeファイルを探します).次のコードを入力します.

desc "  1 --        "#       ,      
task :busboy do 
puts "    " 
end 
 
desc "  2 --   " 
task :bitchfish do 
puts "  ,     " 
end 
 
desc "  3 --   PC" 
task :pc do 
puts "    " 
end 


コマンドラインツールを開き、このファイルがあるディレクトリに入り、次のコマンドを実行します.ほぼ次のような結果になります.

D:\work>rake busboy 
(in D:/work) 
     
 
D:\work>rake bitchfish 
(in D:/work) 
  ,      
 
D:\work\ruby_works\ruby_book>rake laundry 
(in D:/work) 
     


(備考:文字部分は論理的ではなく、純粋な娯楽の下で...)
分析:
上の部分を見終わったら、どうすればいいか知ってると信じています.今いくつかの基礎知識を紹介して、便利で理解を深めます.上のコードから分かるように、このファイルは全部で3つのタスクを定義し、descはRake定義の方法であり、以下の定義タスクの説明を表す.この説明は、Rake-tasks(またはRake-T)コマンドを使用するときに画面に出力.

D:\work>rake --tasks 
(in D:/work) 
rake bitchfish #  2 --    
rake busboy #  1 --        (       ,     ) 
rake pc   3 --   PC 


taskはRakeの最も重要な方法です.その方法の定義はtask(args,&block).タスクボディはblockで、この例ではあなたがしなければならない仕事を簡単に出力するだけです.注意が必要なのはコードです

puts "    " 


完全に1つの普通のRuby文で、putsはRubyの中で出力を行う一般的な方法で、Rakeの任務はRubyの能力を完全に使用することができて、これはとても強いことを見ることができます.
go..go..go..go..
次に依存関係を追加します.
明らかに、私たちが定義した任務の中で、「焼き魚」は「車に乗って車のところへ行く」ことに依存している(他の場所に焼き魚があるかどうかは分からないが、どうせ場所はそこにある).では、タスク定義にこの依存関係を追加する必要があります.変更されたファイルは次のとおりです.

desc "  1 --        " 
task :busboy do 
puts "    " 
end 
 
desc "  2 --   " 
task :bitchfish => :busboy do 
puts "  ,     " 
end 
 
desc "  3 --   PC" 
task :pc do 
puts "    " 
end 


魚焼きタスクを再実行すると、次の結果が得られます.

D:\work>rake bitchfish 
(in D:/work) 
     
  ,      

ネームスペースの追加:
任意のプログラミング言語と同様に、rakeファイルが多い場合、多くのタスクがある場合、それらの命名衝突問題に注目する必要があります.ネーミングスペース(namespace)は自然な解決策です.上の3つのタスクにdanというネーミングスペースを定義することができます.

namespace :dan do 
desc "  1 --        " 
task :busboy do 
puts "    " 
end 
…… 
end 


rake--tasksを再実行すると、次のような結果が得られます.

D:\work >rake --tasks 
(in D:/work) 
rake dan:bitchfish #   2 --    
rake dan:pc #   3 --   PC 
rake dan:busboy #   1 --         


魚を焼く任務を開始するにはrake dan:bitch fishが必要です(BTWは、rakefileで複数のネーミングスペースを使用してタスクを分類することができます.)
上記の2つの知識点を理解した後、次の2つの具体的な例について説明します.
1.あるタスクで別のタスクを呼び出す
タスクが多い場合は、今日やるべきすべての作業をタスクとして定義する必要があります.today.この任務の中で、2つの任務が呼び出される必要があります.1つは焼き魚で、1つはネットカフェPCです.もちろん、焼き魚は車に乗って車のところに行くことに依存しているので、私たちは車に乗って車のところに行く必要があります.ファイルの上部にtodayのタスクを定義します.

desc "     " 
task :today do 
Rake::Task["dan:bitchfish"].invoke 
Rake::Task["dan:pc"].invoke 
end 
 
namespace :dan do 
…… 
end 


他のタスクを呼び出す方法は簡単で、呼び出すだけです.

Rake::Task["task_name"].invoke 


方法でいいです.コマンドラインでrake todayを起動すると、次のようになります.

D:\work >rake today 
(in D:/work) 
     
  ,      
     


2.デフォルトのタスク:
Rakeにデフォルトのタスクを追加することで、このデフォルトのタスクをRakeコマンドで簡単にトリガーすることができます.上記のrakefileでは、次のように「today」タスクをデフォルトのタスクとして使用することができます.

task :default => [:today] 


その後、呼び出しはコマンドラインで直接rakeを呼び出す、呼び出しrake todayと同様の出力結果を得ることができる.
これがRakeタスクの簡単な定義です.以下は完全に修正されたrakefileです.

task :default => [:today] 
 
desc "     " 
task :today do 
 Rake::Task["dan:bitchfish"].invoke 
 Rake::Task["dan:pc"].invoke 
end 
 
namesoace :dan do 
 desc "  1 --        (       ,     )" 
 task :busboy do 
  puts "    " 
 end 
 
 desc "  2 --   " 
 task :bitchfish do 
  puts "  ,     " 
 end 
 
 desc "  3 --   PC" 
 task :pc do 
  puts "    " 
 end 
end 


上の2つの例を見て、rakeタスクはすべて理解しても...他はコード銃の花だ多玩是..