熊手チュートリアル

Rakeは、make、Ant、Phingなどのツールに似た、コードを構築するためのRubyベースの自動化ツールです。 それらの間には大きな違いがありますが。 他のツールとは異なり、Rakeは外部DSL(AntのXMLアセンブリファイルなど)を提供しません。 代わりに、すべてのタスクは純粋なRubyで記述されています。 これにより、完全な柔軟性が得られ、Rubyの便利な機能を使用できます。



ビルドツールとは何ですか?


LinuxまたはUnixシステムにソースからソフトウェアをインストールしようとしたことがある場合、makeを処理しなければならなかった可能性が高くなります。 通常、インストールプロセスは同じように見えます。 最初に、ソースコードが既に解凍されているディレクトリに移動してから、次のコマンドを入力します。



./configure

make

make install









2行目と3行目は、単に呼び出すだけです。 まず、実行時にMakefileを検索します。 ソースコードとそれらの間の依存関係に関する情報が含まれています。 makeは、トポロジ依存関係をソートし、適切な順序で解決しようとします。 このように見えます。最初に、開発者が依存関係を示し、ビルドツールがそれらの処理を担当します。 makeは時間も節約します。 ソースコードが最後のコンパイル以降に変更されていない場合、時間の無駄になるため、再度処理されることはありません。 ビルドツールは、コードのコンパイルだけでなく、これが主なタスクです。 一般に、アセンブリツールは、退屈で反復的なタスクを自動化するために使用されます。



Rakeと他のビルドツールの違い。


先ほど言ったように、Rakeと他のビルドツールには大きな違いが1つあります。 makeのMakefileとAntとPhingのbuild.xmlを書く代わりに、Rubyコードを書くだけです。 あるツールを別のツールに置き換える場合は、新しいビルドツールの構文を学ぶ必要はありません。

しかし、理論は十分ではありません。実践に移りましょう。



Rakeをインストールする


コンピューターにRuby gemがあれば、rakeのインストールは非常に簡単です。 rakeをインストールするには、次のコマンドを入力します。



gem install rake









ほとんどの場合、管理者権限が必要になる可能性があるため、管理者のアカウントに移動するか、sudoプレフィックスを使用します。



sudo gem install rake









rake gemをインストールしたら、最初の例を作成できます。



最初のレーキの例


Rakeタスクを定義する最も簡単な方法は、次のRubyコードを記述することです。



task :default do

puts "Hello World!"

end









Rakeタスクは、常にRakefile、Rakefile、rakefile.rb、またはRakefile.rbという名前のファイルにある必要があります。 最初の2つの形式が最も頻繁に使用されます。 Rakefileが保存されたら、このファイルがあるフォルダーに移動し、次のコマンドを実行します。



$ rake

(in /home/lukasz/ruby/rake_examples)

Hello World!









最初のrakeタスクは正常に機能します。



それで、実際に何が起こったのですか? Rakefileを受け取ると、Rakeはタスクメソッドの呼び出しであるタスクを探します。 1つのRakefileには多くのタスクがあります。 ファイルを実行するときに、実行するタスクの名前を渡すことができます。 タスクが転送されない場合、rakeはデフォルトタスクを検索します。 これが、Rake呼び出しが追加のパラメーターを要求せずにジョブを実行した理由です。



1つのRakefileに多くのタスクを追加してみましょう。



task :ring do

puts "Bell is ringing."

end



task :enter do

puts "Entering home!"

end









パラメータなしでrakeコマンドを実行しようとすると、エラーが発生します。



$ rake

(in /home/lukasz/ruby/rake_examples)

rake aborted!

Don't know how to build task 'default'



(See full trace by running task with --trace)









デフォルトのタスクはこのファイルでは指定されていないため、タスク名を明示的に渡す必要があります。



$ rake enter

(in /home/lukasz/rake_examples)

Entering home!

$ rake ring

(in /home/lukasz/rake_examples)

Bell is ringing.









一見、この例は正常に機能しますが、それでもコードにエラーが入り込みました。つまり、ドアベルを鳴らさずに家に入ることはできません。 これが中毒の始まりです。



依存関係を追加


ファイルを少し変更しましょう。



task :ring do

puts "Bell is ringing."

end



task :enter => :ring do

puts "Entering home!"

end









今、あなたが家に入るとき、ドアベルが最初に鳴ります:



$ rake enter

(in /home/lukasz/ruby/rake_examples)

Bell is ringing.

Entering home!









現在、Rakeは入る前にドアを鳴らします。 より複雑な依存関係を宣言すると、Rakeがそれらを解決します。 必要なものをすべて指定するだけで、rakeは面倒な作業をすべて行います。



幸いなことに、タスクを定義するときだけでなく、時間条件が満たされているかどうかに応じて、依存関係を示すことができます。 最後に、静的XMLファイルではなく、Rubyプログラミング言語でタスクを作成します、覚えていますか?



ドアベルで同じ効果を得るには、次のように記述できます。



task :ring do

puts "Bell is ringing."

end



task :enter do

puts "Entering home!"

end



task :enter => :ring









そして、効果は同じになります。



タスクの説明。


作成する各課題は、いくつかの簡単な言葉で説明できます。 説明は組み込みのコメントとして役立つだけでなく、利用可能なタスクのリストにも表示されます。 説明を追加しましょう。



desc 'Ring the bell'

task :ring do

puts "Bell is ringing."

end



desc 'Enter home'

task :enter => :ring do

puts "Entering home!"

end









利用可能なタスクのリストを表示するには、-Tまたは--tasksオプションを指定してrakeを実行します。



$ rake -T

(in /home/lukasz/ruby/rake_examples)

rake enter # Enter home

rake ring # Ring the bell









先ほど言ったように、ビルドツールはプロジェクトのコンパイルを簡単にするために作成されました。 たくさんあります

多くのビルドツールと同様に、個々のファイルとRake間の依存関係がこれをサポートしています。 これにより、特別なタイプのタスク-ファイルタスクを定義できます。



file 'products.sql' => 'products.xml' do

# build SQL INSERT clause and save it in products.sql file,

# basing on products.xml datafile

end









ファイルタスク-一般的に-通常のタスクと違いはありません。 実際、入力ファイル(この場合はproducts.xml)が存在しないと機能しません。 結果ファイル(products.sql)が入力ファイルより古くない場合にも機能しません。 この動作が適切でない場合は、タスクを開始するたびに出力ファイルを上書きする必要があり、通常のタスクを使用します。



Fileutils




RakeにはFileutilモジュールが含まれており、mkdir、rmdir、cp、chmod、touchなど、Unixに似た多くのメソッドが提供されます。

Fileutilsモジュールが既に含まれているため、オペレーターフレームワークを使用せずにこれらのメソッドを直接呼び出すことができます。



task :manipulate_files do

mkdir 'new_dir'

mv 'new_dir', 'lukasz'

chmod 0777, 'lukasz'

touch 'lukasz/wrobel.txt'

rm_rf 'lukasz'

end









Linux / Unixシェルに精通している場合は、このモジュールを短時間で学習できます。

ところで、タスクファイルの動作を覚えていますか? 出力ファイルが入力ファイルより古くない場合、タスクファイルは機能しません。 通常のタスクでこのようなチェックを実行する場合は、uptodateと呼ばれるFileutilsメソッドを使用できます。



task :check do

# ...



unless uptodate?(output_file, input_file)

# regenerate output_file

end

end









ファイルリスト


1つの出力ファイルを取得するために多くの入力ファイルが結合されたタスクファイルを想像してください。 ファイル間の依存関係を判断する最も明白な方法は次のとおりです。



one_file_to_rule_them_all = 'database.sql'

tables_sql = ['orders.sql', 'payments.sql', 'categories.sql']



file one_file_to_rule_them_all => tables_sql









これは機能しますが、別の入力SQLファイルを作成するとどうなりますか? リストに追加する必要があることを覚えておく必要があります。



私はあなたのことは知りませんが、少し混乱しています。 既に述べたように、ビルドツールは、退屈で反復的なタスクを自動化するように設計されています。 リストにファイルを追加するのは退屈な作業です。 幸い、Rakeもこれを知っていました。



このような状況で役立つFileListクラスがあります。 今すぐ使用しましょう:



one_file_to_rule_them_all = 'database.sql'



FileList['*.sql'].each {|table| file one_file_to_rule_them_all => table}









リストに個々のSQLファイルを追加するのを忘れてください。 熊手があなたのためにそれを行います。



注釈


clean、clobber、rdoc、gemのタスク、パスマップ、ルール、名前空間など、この説明ではカバーしなかったRake関数が多数あります。 後でそれらについて学ぶ機会があります。

この記事がRakeのアイデアを得るための良い出発点になることを願っています。 Rakeはその価値を証明しており、現在Rubyの世界で広く使用されているため、Rakeタスクを書くことは必須です。 独自のRake実験で頑張ってください。



PS元の記事はここで読むことができます。



All Articles