ビルドツールとは何ですか?
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元の記事はここで読むことができます。