SlideShare a Scribd company logo
1 of 23
Download to read offline
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
ご清聴ありがとう
ございました

More Related Content

What's hot

関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
ゼロトラスト・アーキテクチャを無料で(やれるだけ)実現する
ゼロトラスト・アーキテクチャを無料で(やれるだけ)実現するゼロトラスト・アーキテクチャを無料で(やれるだけ)実現する
ゼロトラスト・アーキテクチャを無料で(やれるだけ)実現するKeioOyama
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術Etsuji Nakai
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼうxenophobia__
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
リーダブルコード
リーダブルコードリーダブルコード
リーダブルコードKeita Otsuka
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりYuta Ohashi
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略Yasutomo Uemori
 
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったかHiroshi Tokumaru
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Base DDD(ドメイン駆動設計) 参考文献を巡る旅Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Base DDD(ドメイン駆動設計) 参考文献を巡る旅Takuya Kawabe
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Takahiko Ito
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すTakaya Saeki
 
The Shift Left Path and OWASP
The Shift Left Path and OWASPThe Shift Left Path and OWASP
The Shift Left Path and OWASPRiotaro OKADA
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則bonjin6770 Kurosawa
 

What's hot (20)

関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編
 
ゼロトラスト・アーキテクチャを無料で(やれるだけ)実現する
ゼロトラスト・アーキテクチャを無料で(やれるだけ)実現するゼロトラスト・アーキテクチャを無料で(やれるだけ)実現する
ゼロトラスト・アーキテクチャを無料で(やれるだけ)実現する
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼう
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
リーダブルコード
リーダブルコードリーダブルコード
リーダブルコード
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略オンラインゲームのRails複数db戦略
オンラインゲームのRails複数db戦略
 
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Base DDD(ドメイン駆動設計) 参考文献を巡る旅Base DDD(ドメイン駆動設計) 参考文献を巡る旅
Base DDD(ドメイン駆動設計) 参考文献を巡る旅
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
 
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
llvm入門
llvm入門llvm入門
llvm入門
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
WebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
 
The Shift Left Path and OWASP
The Shift Left Path and OWASPThe Shift Left Path and OWASP
The Shift Left Path and OWASP
 
20160526 依存関係逆転の原則
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則
 

Similar to Rake

ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Taisuke Shiratori
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!Kiwamu Okabe
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
Scotty を利用した "ゆるふわ" Web サービス作成
Scotty を利用した "ゆるふわ" Web サービス作成Scotty を利用した "ゆるふわ" Web サービス作成
Scotty を利用した "ゆるふわ" Web サービス作成krdlab
 
Rails Controller Fundamentals
Rails Controller FundamentalsRails Controller Fundamentals
Rails Controller FundamentalsTakashi SAKAGUCHI
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Koji SHIMADA
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞYoichi Toyota
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogrammingMasanori Kado
 
kpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたいkpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたいkoki_h
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門Tomoya Kawanishi
 
Sass/Compass講習会
Sass/Compass講習会Sass/Compass講習会
Sass/Compass講習会Beeworks
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてTomoya Kawanishi
 
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma次世代DaoフレームワークDoma
次世代DaoフレームワークDomaToshihiro Nakamura
 
基本の WordPress コーディング規約 / WordCamp Tokyo 2016 LT
基本の WordPress コーディング規約 / WordCamp Tokyo 2016 LT基本の WordPress コーディング規約 / WordCamp Tokyo 2016 LT
基本の WordPress コーディング規約 / WordCamp Tokyo 2016 LTAkira Tachibana
 
Customization of DBIC::Schema::Loader
Customization of DBIC::Schema::LoaderCustomization of DBIC::Schema::Loader
Customization of DBIC::Schema::LoaderToru Yamaguchi
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringMakoto Ohnami
 

Similar to Rake (20)

ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
 
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!ReVIEWとLibreOfficeとOMakeで本を書きましょう!
ReVIEWとLibreOfficeとOMakeで本を書きましょう!
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Scotty を利用した "ゆるふわ" Web サービス作成
Scotty を利用した "ゆるふわ" Web サービス作成Scotty を利用した "ゆるふわ" Web サービス作成
Scotty を利用した "ゆるふわ" Web サービス作成
 
Rails Controller Fundamentals
Rails Controller FundamentalsRails Controller Fundamentals
Rails Controller Fundamentals
 
Sass(SCSS)について
Sass(SCSS)についてSass(SCSS)について
Sass(SCSS)について
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
 
Rでreproducible research
Rでreproducible researchRでreproducible research
Rでreproducible research
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 
第5回LinkedData勉強会@yayamamo
第5回LinkedData勉強会@yayamamo第5回LinkedData勉強会@yayamamo
第5回LinkedData勉強会@yayamamo
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 
kpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたいkpfx07 LT ruby-processingでイケメンになりたい
kpfx07 LT ruby-processingでイケメンになりたい
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 
Sass/Compass講習会
Sass/Compass講習会Sass/Compass講習会
Sass/Compass講習会
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
 
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma次世代DaoフレームワークDoma
次世代DaoフレームワークDoma
 
基本の WordPress コーディング規約 / WordCamp Tokyo 2016 LT
基本の WordPress コーディング規約 / WordCamp Tokyo 2016 LT基本の WordPress コーディング規約 / WordCamp Tokyo 2016 LT
基本の WordPress コーディング規約 / WordCamp Tokyo 2016 LT
 
Customization of DBIC::Schema::Loader
Customization of DBIC::Schema::LoaderCustomization of DBIC::Schema::Loader
Customization of DBIC::Schema::Loader
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo Spring
 

More from Tomoya Kawanishi

ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例Tomoya Kawanishi
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウTomoya Kawanishi
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列についてTomoya Kawanishi
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてTomoya Kawanishi
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されることTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現についてTomoya Kawanishi
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行についてTomoya Kawanishi
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについてTomoya Kawanishi
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことTomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと WebクローリングについてTomoya Kawanishi
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO についてTomoya Kawanishi
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介Tomoya Kawanishi
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについてTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 

More from Tomoya Kawanishi (20)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについて
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 

Rake

  • 2. 大手町.rb #12 「Rakeについて」 1自己紹介 Tomoya Kawanishi 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
  • 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