Rakeについて
2018/12/12
大手町.rb #12
大手町.rb #12 「Rakeについて」
1自己紹介
Tomoya Kawanishi a.k.a. @cuzic
エネチェンジ株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!
Ruby関西の中の人
発表者として登壇くださる方、あとで声かけください。
大手町.rb の中の人
毎月 大手町.rb の開催を予定
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
大手町.rb #12 「Rakeについて」
Disclaimer
大手町.rb は祝!12回!
人数がとても増えてきました!
大手町.rb は(比較的)初級者向けの勉強会
とはいえ、初級者向けのままだと、ネタ切れしちゃう
同じネタをリピートするか、レベルアップするか。
大手町.rb はレベルアップしていく方向!
今のオーディエンスを大切にしていく!
2
大手町.rb #12 「Rakeについて」
今日のテーマ
Rake について
Ruby on Rails でも標準的に使われている
とはいえ、時間をとって学ぶことがあまりない
というのも事実
ドキュメントを熟読すればいいのですが、
なかなか上から読むのは大変です。
今日は一緒に学んでいきましょう
3
大手町.rb #12 「Rakeについて」
ビルドツールの主な使い方
ビルド
定義されたルールに従った処理(コンパイルなど)
ex) *.c を *.o にコンパイル
依存関係の処理があるときに便利
ex) hello.c と hello.h のどちらかが更新されていた場合
コンパイルを実行し、 hello.o を再作成
一部を書き換えたときに、必要な作業のみを実施可能
ex) hello.c だけが変更がある場合は、hello.o を再作成
タスク
事前に登録した任意の作業を実施
Rails での例
データベース処理(マイグレートなど)
テスト
キャッシュやログなどのクリア
ドキュメント生成など
4
大手町.rb #12 「Rakeについて」
5ビルドツールいろいろ
歴史的に数多くのビルドツールが存在
Make : 伝統的なビルドツール
単語のリストや展開などの概念がカオス
Ant : Java で多く使われる
あの XML をAntエディターなしで作る気にはならない
Maven :ビルドを含めたプロジェクト管理ツール
Java向け。Antよりはいいけど、XMLが、ね。。。
Gradle : Ant や Maven の考え方を引き継いだビルドツール。
Groovy を使った内部 DSL
Rake : Ruby DSL として書かれたビルドツール
なんでもでき、読みやすく、書きやすい。
Grunt : JavaScript 向けのビルドツール。
JSON を使って設定を書いて実行する。
Gulp : JavaScript 向けのビルドツール。pipe を使って
タスクを順番に処理する。
大手町.rb #12 「Rakeについて」
Q. Rake クイズ
次の 2つの実行結果の違いを説明せよ
6
> cat build.rb
system <<SCRIPT
./hello
./world
SCRIPT
> ruby build.rb
(ヒント)
・ Kernel#system は 任意のコマンドを実行するための組み込みメソッド。
・ 複数行書かれれば、1行ずつ順に実行される
・ Rakefile では、引数なしで実行すると、
① カレントディレクトリの Rakefile を探し、
② その中の :default タスクを実行する
・ Rakefile では task タスク名 do 処理内容 end でタスクを定義できる
・ sh は任意のコマンドを実行する Rake が提供するメソッド
> cat Rakefile
task :default do
sh "./hello"
sh "./world"
end
> rake
大手町.rb #12 「Rakeについて」
A. Rakeクイズ 解答
(1) 表示内容の違い
(2)失敗時に abort するかの違い
7
> ruby build.rb
hello
world
> rake
(in /home/~ )
./hello
hello
./world
world
> cat ./hello
puts "hello"; exit 1
> ruby build.rb
hello
world
1行目のexit code が
ゼロ以外でも
2行目が実行される
> rake
(in /home/~ )
./hello
hello
rake aborted!
Command failed with ~~
1行目のexit code が
ゼロ以外の場合は、
abort し、以降は実行されない
実行ディレクトリを表示
./hello : 1行目のコマンド
hello : 1行目の実行結果
./world : 2行目のコマンド
world : 2行目の実行結果
大手町.rb #12 「Rakeについて」
A. Rakeクイズ 解説
(1) 表示内容の違い
Rake を利用すると、豊富なデバッグメッセージを利用できます。
実行したコマンド内容が逐次確認できて便利です。なお、
とすると、実行コマンドの表示を抑止できます。
(2)実行可否の違い
Rake の sh は、失敗時に自動的にエラーメッセージを表示して
スクリプトの処理が異常終了し、それ以降の処理を実行しません。
この動作は、多くのバッチ処理で期待される動作です。
シェルスクリプトや system コマンドなどでは本来しなければ
ならなかった異常終了させることを忘れ、困った結果になったりします。
しかしながら、Rake の sh を使えば異常終了を忘れることはありません。
8
> rake –q > rake –sまたは
大手町.rb #12 「Rakeについて」
デフォルトと、タスク
task : 新しい Rake タスクを定義できる
task の中で default を指定することで、引数なしで
実行したときのデフォルト動作を指定できる
ruby : Rake の中で Ruby コマンドを実行できる
9
task default: %w[test]
task :test do
ruby "test/unittest.rb"
end
> rake
> rake test # 上と同じ動作になる
Rakefile
大手町.rb #12 「Rakeについて」
Rake のコマンドライン 10
$ rake --help
-C, --classic-namespace トップレベルに Task, FileTask を定義します。
過去との互換性のためのオプションです。
-D, --describe [PATTERN] パターンにマッチしたタスクの詳細を表示して終了します。
パターンは省略可能です。
-n, --dry-run アクションを実行せずにタスクを実行します。
-e, --execute CODE Ruby のコードを実行して終了します。
-p, --execute-print CODE Ruby のコードを実行して結果を表示して終了します。
-E, --execute-continue CODE Ruby のコードを実行してから、タスクを実行します。
-I, --libdir LIBDIR ロードパスに LIBDIR を含めます。
-P, --prereqs タスクの依存関係を表示して終了します。
-q, --quiet 標準出力にログメッセージを表示しません。
-f, --rakefile [FILE] FILE を Rakefile として使用します。
-R, --rakelibdir RAKELIBDIR RAKELIBDIR にある *.rake ファイルを自動的にインポートします。
--rakelib デフォルトは rakelib です。
-r, --require MODULE Rakefile を実行する前に MODULE を require します。
--rules ルールの解決を追跡します。
-N, --no-search, --nosearch 親ディレクトリの Rakefile を検索しません。
-s, --silent --quiet に似ていますが、ディレクトリも表示しません。
-g, --system システム全体の Rakefile を使用します。('~/.rake/*.rake')
-G, --no-system, --nosystem システム全体の Rakefile を使用しません。
-T, --tasks [PATTERN] パターンにマッチしたタスクの短い説明を表示して終了します。
パターンは省略可能です。
-t, --trace 全てのバックトレースを表示します。
-v, --verbose 標準出力にログメッセージを表示します (デフォルト)。
-V, --version このプログラムのバージョンを表示します。
-h, -H, --help このメッセージを表示します。
大手町.rb #12 「Rakeについて」
依存関係の定義と file タスク
file: ファイルを生成するためのタスクを定義する
依存関係があってもなくてもいい
依存関係があれば、ハッシュ形式で記述する
タスクのブロック引数
下記の t は Rake::Task クラスのオブジェクト
t.name は生成しようとしているファイル
t.sources は依存関係のあるファイルの配列
11
postcode_csv = Rails.root + "lib/assets/KEN_ALL_ROME.csv"
file postcode_csv do # 依存関係なし
sh "aws s3 cp s3://なんとかかんとか/KEN_ALL_ROME.csv #{postcode_csv}"
end
postcode_dbm = Rails.root + "lib/assets/postcode.dbm"
file postcode_dbm => postcode_csv do |t|
# postcode_dbm は postcode_csv に依存。 postcode_csv がなければ自動的に取得。
ruby "lib/postcode_csv2dbm.rb #{t.sources.first} #{t.name}"
end
Rakefile
大手町.rb #12 「Rakeについて」
rule : 一定のルールでファイルを変換
rule "ターゲットの拡張子" => "依存ファイルの拡張子"
拡張子で、やりたいビルド内容が決まる場合にベンリ
Rake は Ruby でできることはなんでもできる
def … end で定義したメソッドを呼び出すこともできる
t.source は最初の依存ファイル
12
def sassc(target, source)
environment = Enechange::Application.assets
context = environment.context_class.new(
environment: environment, name: '', filename: '', metadata: {}
)
options = {context: context, environment: environment}
engine = Sass::Engine.for_file(source, sprockets: options)
IO.write(target, engine.render)
end
rule '.css' => ['.scss'] do |t| # rule
sassc t.name, t.source
end
大手町.rb #12 「Rakeについて」
rule の上級編
rule の target 側は正規表現を指定することもできる
正規表現にマッチする場合にそのルールが適用される
rule の sources で Proc を指定することもできる
target のファイル名から複雑なロジックで、
依存するファイル名を導出できる
13
CSS_DIR = "css"
SASS_DIR = "scss"
def css_to_scss
Proc.new do |filename|
filename.sub(/^#{CSS_DIR}/, SASS_DIR).sub(/¥.css$/, '.scss')
end
end
rule %r{^#{CSS_DIR}/.*¥.css$} => css_to_scss do |t|
sassc t.name, t.source
end
大手町.rb #12 「Rakeについて」
rule の上級編(おまけ)
rule の sources のところでは、
Proc オブジェクトだけでなく Method オブジェクトを
指定することもできる
method メソッドを使うことで、より簡潔に書ける
14
CSS_DIR = "css"
SASS_DIR = "scss"
def css_to_scss(filename)
filename.sub(/^#{CSS_DIR}/, SASS_DIR).sub(/¥.css$/, '.scss')
end
rule %r{^#{CSS_DIR}/.*¥.css$} => method(:css_to_scss) do |t|
sassc t.name, t.source
end
大手町.rb #12 「Rakeについて」
ディレクトリタスクなど
ディレクトリタスクを使うと、ディレクトリの作成を明示不要
ディレクトリを必要とするタスクについては、依存タスクに記載しておく
ない場合は作成するし、すでにある場合は何もしない
依存関係にディレクトリタスクを含めることで、
ないときはディレクトリを作成する処理が簡潔に書ける
15
CSS_DIR = "css"
SASS_DIR = "scss"
directory SASS_DIR
rule %r{^#{CSS_DIR}/.*¥.css$} => [css_to_scss, SASS_DIR] do |t|
sassc t.name, t.source
end
大手町.rb #12 「Rakeについて」
クリーニング
作成したファイルを一度削除したいことはままある
依存関係が複雑で、更新日時だけではうまく解決できないとき
不要な一時ファイルを削除したいとき
疲れてきて、コーヒー休憩する口実が欲しいとき
require ‘rake/clean’ で clean (一時ファイル用)と
clobber (すべてのファイル用)の2つのタスクを利用可能
16
require 'rake/clean'
# clean で消すものに加え coverage と specdoc を削除
CLOBBER.include 'coverage', 'specdoc'
# pkg と tmp を削除
CLEAN.include 'pkg', 'tmp'
大手町.rb #12 「Rakeについて」
namespace、FileList、 invoke
Rake のタスクを分類したいときはnamespace を使う
タスクに “-” を含めることもできる(例: :"create-all")
FileList はファイル名(文字列)の配列のように扱える
Rake::Task[タスク名].invoke でRake タスクを実行できる
依存関係を含めて実行する
Rake::Task[タスク名].execute だと、依存関係を無視して実行
17
namespace :css do
task :"create-all" do
FileList["#{CSS_DIR}/**/*.css"].each do |filename|
Rake::Task[filename].invoke
end
end
end
> rake css:create-all
大手町.rb #12 「Rakeについて」
Rake で引数
環境変数を使う方法
タスク引数を使う方法
18
task :rails_env do
puts "RAILS_ENV=#{ENV["RAILS_ENV"]}"
end
> rake rails_env RAILS_ENV=development
task :show_args, ['arg1', 'arg2'] do |task, args|
p task #=> <Rake::Task show_args => (snip)>
p args
end
> rake show_args[hoge,huga]
<Rake::Task show_args => []>
#<Rake::TaskArguments arg1: hoge, arg2: huga>
大手町.rb #12 「Rakeについて」
Rake の 注意点
ブロックには do ~ end を使う
Ruby の文法上の制限で { } が期待どおり動作しない
19
下記の回避方法はあるが、DSL 的でないため、通常は
do ~ end を使うことが好まれる
> cat Rakefile
task :default {|t|
puts “Hello, World!”
}
> rake
(in ~)
rake aborted!
~: syntax error, unexpected '{', expecting $end
(See full trace by running task with --trace)
> cat Rakefile
task(:default) {|t|
puts “Hello, World!”
}
大手町.rb #12 「Rakeについて」
発展的な話題
下記は興味があるなら自分で調べてみましょう
multitask
複数のタスクを並列実行する
rake/gempackagetask
Gem のパッケージを作成するためのタスク
rake/packagetask
tar.gz, zip などのパッケージを作成するためのタスク
rake/rdoctask
rdoc のドキュメンテーションを作成するタスク
rake/testtask
ユニットテストを実行するタスクを作成する
20
大手町.rb #12 「Rakeについて」
まとめ
Rake を使うと、エラー処理を記述不要で楽
sh を使えば、エラー時の処理停止が自動的に行われる
定義されたルールから依存関係を自動解決可能
コンパイル、テキスト処理、他多数のコマンドに応用可能
複雑なタスクも記述可能
依存ファイルの推定ロジックのカスタマイズ
タスク処理中での別のタスクの呼び出し
任意の Ruby スクリプトも記述可能
ファイル名を動的に取得可能
標準的なRake タスクも require により用意可能
クリーニング
21
ご清聴ありがとう
ございました

Rake

  • 1.
  • 2.
    大手町.rb #12 「Rakeについて」 1自己紹介 TomoyaKawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も! Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 大手町.rb の中の人 毎月 大手町.rb の開催を予定 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット
  • 3.
    大手町.rb #12 「Rakeについて」 Disclaimer 大手町.rbは祝!12回! 人数がとても増えてきました! 大手町.rb は(比較的)初級者向けの勉強会 とはいえ、初級者向けのままだと、ネタ切れしちゃう 同じネタをリピートするか、レベルアップするか。 大手町.rb はレベルアップしていく方向! 今のオーディエンスを大切にしていく! 2
  • 4.
    大手町.rb #12 「Rakeについて」 今日のテーマ Rakeについて Ruby on Rails でも標準的に使われている とはいえ、時間をとって学ぶことがあまりない というのも事実 ドキュメントを熟読すればいいのですが、 なかなか上から読むのは大変です。 今日は一緒に学んでいきましょう 3
  • 5.
    大手町.rb #12 「Rakeについて」 ビルドツールの主な使い方 ビルド 定義されたルールに従った処理(コンパイルなど) ex)*.c を *.o にコンパイル 依存関係の処理があるときに便利 ex) hello.c と hello.h のどちらかが更新されていた場合 コンパイルを実行し、 hello.o を再作成 一部を書き換えたときに、必要な作業のみを実施可能 ex) hello.c だけが変更がある場合は、hello.o を再作成 タスク 事前に登録した任意の作業を実施 Rails での例 データベース処理(マイグレートなど) テスト キャッシュやログなどのクリア ドキュメント生成など 4
  • 6.
    大手町.rb #12 「Rakeについて」 5ビルドツールいろいろ 歴史的に数多くのビルドツールが存在 Make: 伝統的なビルドツール 単語のリストや展開などの概念がカオス Ant : Java で多く使われる あの XML をAntエディターなしで作る気にはならない Maven :ビルドを含めたプロジェクト管理ツール Java向け。Antよりはいいけど、XMLが、ね。。。 Gradle : Ant や Maven の考え方を引き継いだビルドツール。 Groovy を使った内部 DSL Rake : Ruby DSL として書かれたビルドツール なんでもでき、読みやすく、書きやすい。 Grunt : JavaScript 向けのビルドツール。 JSON を使って設定を書いて実行する。 Gulp : JavaScript 向けのビルドツール。pipe を使って タスクを順番に処理する。
  • 7.
    大手町.rb #12 「Rakeについて」 Q.Rake クイズ 次の 2つの実行結果の違いを説明せよ 6 > cat build.rb system <<SCRIPT ./hello ./world SCRIPT > ruby build.rb (ヒント) ・ Kernel#system は 任意のコマンドを実行するための組み込みメソッド。 ・ 複数行書かれれば、1行ずつ順に実行される ・ Rakefile では、引数なしで実行すると、 ① カレントディレクトリの Rakefile を探し、 ② その中の :default タスクを実行する ・ Rakefile では task タスク名 do 処理内容 end でタスクを定義できる ・ sh は任意のコマンドを実行する Rake が提供するメソッド > cat Rakefile task :default do sh "./hello" sh "./world" end > rake
  • 8.
    大手町.rb #12 「Rakeについて」 A.Rakeクイズ 解答 (1) 表示内容の違い (2)失敗時に abort するかの違い 7 > ruby build.rb hello world > rake (in /home/~ ) ./hello hello ./world world > cat ./hello puts "hello"; exit 1 > ruby build.rb hello world 1行目のexit code が ゼロ以外でも 2行目が実行される > rake (in /home/~ ) ./hello hello rake aborted! Command failed with ~~ 1行目のexit code が ゼロ以外の場合は、 abort し、以降は実行されない 実行ディレクトリを表示 ./hello : 1行目のコマンド hello : 1行目の実行結果 ./world : 2行目のコマンド world : 2行目の実行結果
  • 9.
    大手町.rb #12 「Rakeについて」 A.Rakeクイズ 解説 (1) 表示内容の違い Rake を利用すると、豊富なデバッグメッセージを利用できます。 実行したコマンド内容が逐次確認できて便利です。なお、 とすると、実行コマンドの表示を抑止できます。 (2)実行可否の違い Rake の sh は、失敗時に自動的にエラーメッセージを表示して スクリプトの処理が異常終了し、それ以降の処理を実行しません。 この動作は、多くのバッチ処理で期待される動作です。 シェルスクリプトや system コマンドなどでは本来しなければ ならなかった異常終了させることを忘れ、困った結果になったりします。 しかしながら、Rake の sh を使えば異常終了を忘れることはありません。 8 > rake –q > rake –sまたは
  • 10.
    大手町.rb #12 「Rakeについて」 デフォルトと、タスク task: 新しい Rake タスクを定義できる task の中で default を指定することで、引数なしで 実行したときのデフォルト動作を指定できる ruby : Rake の中で Ruby コマンドを実行できる 9 task default: %w[test] task :test do ruby "test/unittest.rb" end > rake > rake test # 上と同じ動作になる Rakefile
  • 11.
    大手町.rb #12 「Rakeについて」 Rakeのコマンドライン 10 $ rake --help -C, --classic-namespace トップレベルに Task, FileTask を定義します。 過去との互換性のためのオプションです。 -D, --describe [PATTERN] パターンにマッチしたタスクの詳細を表示して終了します。 パターンは省略可能です。 -n, --dry-run アクションを実行せずにタスクを実行します。 -e, --execute CODE Ruby のコードを実行して終了します。 -p, --execute-print CODE Ruby のコードを実行して結果を表示して終了します。 -E, --execute-continue CODE Ruby のコードを実行してから、タスクを実行します。 -I, --libdir LIBDIR ロードパスに LIBDIR を含めます。 -P, --prereqs タスクの依存関係を表示して終了します。 -q, --quiet 標準出力にログメッセージを表示しません。 -f, --rakefile [FILE] FILE を Rakefile として使用します。 -R, --rakelibdir RAKELIBDIR RAKELIBDIR にある *.rake ファイルを自動的にインポートします。 --rakelib デフォルトは rakelib です。 -r, --require MODULE Rakefile を実行する前に MODULE を require します。 --rules ルールの解決を追跡します。 -N, --no-search, --nosearch 親ディレクトリの Rakefile を検索しません。 -s, --silent --quiet に似ていますが、ディレクトリも表示しません。 -g, --system システム全体の Rakefile を使用します。('~/.rake/*.rake') -G, --no-system, --nosystem システム全体の Rakefile を使用しません。 -T, --tasks [PATTERN] パターンにマッチしたタスクの短い説明を表示して終了します。 パターンは省略可能です。 -t, --trace 全てのバックトレースを表示します。 -v, --verbose 標準出力にログメッセージを表示します (デフォルト)。 -V, --version このプログラムのバージョンを表示します。 -h, -H, --help このメッセージを表示します。
  • 12.
    大手町.rb #12 「Rakeについて」 依存関係の定義とfile タスク file: ファイルを生成するためのタスクを定義する 依存関係があってもなくてもいい 依存関係があれば、ハッシュ形式で記述する タスクのブロック引数 下記の t は Rake::Task クラスのオブジェクト t.name は生成しようとしているファイル t.sources は依存関係のあるファイルの配列 11 postcode_csv = Rails.root + "lib/assets/KEN_ALL_ROME.csv" file postcode_csv do # 依存関係なし sh "aws s3 cp s3://なんとかかんとか/KEN_ALL_ROME.csv #{postcode_csv}" end postcode_dbm = Rails.root + "lib/assets/postcode.dbm" file postcode_dbm => postcode_csv do |t| # postcode_dbm は postcode_csv に依存。 postcode_csv がなければ自動的に取得。 ruby "lib/postcode_csv2dbm.rb #{t.sources.first} #{t.name}" end Rakefile
  • 13.
    大手町.rb #12 「Rakeについて」 rule: 一定のルールでファイルを変換 rule "ターゲットの拡張子" => "依存ファイルの拡張子" 拡張子で、やりたいビルド内容が決まる場合にベンリ Rake は Ruby でできることはなんでもできる def … end で定義したメソッドを呼び出すこともできる t.source は最初の依存ファイル 12 def sassc(target, source) environment = Enechange::Application.assets context = environment.context_class.new( environment: environment, name: '', filename: '', metadata: {} ) options = {context: context, environment: environment} engine = Sass::Engine.for_file(source, sprockets: options) IO.write(target, engine.render) end rule '.css' => ['.scss'] do |t| # rule sassc t.name, t.source end
  • 14.
    大手町.rb #12 「Rakeについて」 ruleの上級編 rule の target 側は正規表現を指定することもできる 正規表現にマッチする場合にそのルールが適用される rule の sources で Proc を指定することもできる target のファイル名から複雑なロジックで、 依存するファイル名を導出できる 13 CSS_DIR = "css" SASS_DIR = "scss" def css_to_scss Proc.new do |filename| filename.sub(/^#{CSS_DIR}/, SASS_DIR).sub(/¥.css$/, '.scss') end end rule %r{^#{CSS_DIR}/.*¥.css$} => css_to_scss do |t| sassc t.name, t.source end
  • 15.
    大手町.rb #12 「Rakeについて」 ruleの上級編(おまけ) rule の sources のところでは、 Proc オブジェクトだけでなく Method オブジェクトを 指定することもできる method メソッドを使うことで、より簡潔に書ける 14 CSS_DIR = "css" SASS_DIR = "scss" def css_to_scss(filename) filename.sub(/^#{CSS_DIR}/, SASS_DIR).sub(/¥.css$/, '.scss') end rule %r{^#{CSS_DIR}/.*¥.css$} => method(:css_to_scss) do |t| sassc t.name, t.source end
  • 16.
  • 17.
    大手町.rb #12 「Rakeについて」 クリーニング 作成したファイルを一度削除したいことはままある 依存関係が複雑で、更新日時だけではうまく解決できないとき 不要な一時ファイルを削除したいとき 疲れてきて、コーヒー休憩する口実が欲しいとき require‘rake/clean’ で clean (一時ファイル用)と clobber (すべてのファイル用)の2つのタスクを利用可能 16 require 'rake/clean' # clean で消すものに加え coverage と specdoc を削除 CLOBBER.include 'coverage', 'specdoc' # pkg と tmp を削除 CLEAN.include 'pkg', 'tmp'
  • 18.
    大手町.rb #12 「Rakeについて」 namespace、FileList、invoke Rake のタスクを分類したいときはnamespace を使う タスクに “-” を含めることもできる(例: :"create-all") FileList はファイル名(文字列)の配列のように扱える Rake::Task[タスク名].invoke でRake タスクを実行できる 依存関係を含めて実行する Rake::Task[タスク名].execute だと、依存関係を無視して実行 17 namespace :css do task :"create-all" do FileList["#{CSS_DIR}/**/*.css"].each do |filename| Rake::Task[filename].invoke end end end > rake css:create-all
  • 19.
    大手町.rb #12 「Rakeについて」 Rakeで引数 環境変数を使う方法 タスク引数を使う方法 18 task :rails_env do puts "RAILS_ENV=#{ENV["RAILS_ENV"]}" end > rake rails_env RAILS_ENV=development task :show_args, ['arg1', 'arg2'] do |task, args| p task #=> <Rake::Task show_args => (snip)> p args end > rake show_args[hoge,huga] <Rake::Task show_args => []> #<Rake::TaskArguments arg1: hoge, arg2: huga>
  • 20.
    大手町.rb #12 「Rakeについて」 Rakeの 注意点 ブロックには do ~ end を使う Ruby の文法上の制限で { } が期待どおり動作しない 19 下記の回避方法はあるが、DSL 的でないため、通常は do ~ end を使うことが好まれる > cat Rakefile task :default {|t| puts “Hello, World!” } > rake (in ~) rake aborted! ~: syntax error, unexpected '{', expecting $end (See full trace by running task with --trace) > cat Rakefile task(:default) {|t| puts “Hello, World!” }
  • 21.
    大手町.rb #12 「Rakeについて」 発展的な話題 下記は興味があるなら自分で調べてみましょう multitask 複数のタスクを並列実行する rake/gempackagetask Gemのパッケージを作成するためのタスク rake/packagetask tar.gz, zip などのパッケージを作成するためのタスク rake/rdoctask rdoc のドキュメンテーションを作成するタスク rake/testtask ユニットテストを実行するタスクを作成する 20
  • 22.
    大手町.rb #12 「Rakeについて」 まとめ Rakeを使うと、エラー処理を記述不要で楽 sh を使えば、エラー時の処理停止が自動的に行われる 定義されたルールから依存関係を自動解決可能 コンパイル、テキスト処理、他多数のコマンドに応用可能 複雑なタスクも記述可能 依存ファイルの推定ロジックのカスタマイズ タスク処理中での別のタスクの呼び出し 任意の Ruby スクリプトも記述可能 ファイル名を動的に取得可能 標準的なRake タスクも require により用意可能 クリーニング 21
  • 23.