Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rake

466 views

Published on

about Rakefile, Rake of Ruby build tool

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Rake

  1. 1. Rakeについて 2018/12/12 大手町.rb #12
  2. 2. 大手町.rb #12 「Rakeについて」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も! Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 大手町.rb の中の人 毎月 大手町.rb の開催を予定 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット
  3. 3. 大手町.rb #12 「Rakeについて」 Disclaimer 大手町.rb は祝!12回! 人数がとても増えてきました! 大手町.rb は(比較的)初級者向けの勉強会 とはいえ、初級者向けのままだと、ネタ切れしちゃう 同じネタをリピートするか、レベルアップするか。 大手町.rb はレベルアップしていく方向! 今のオーディエンスを大切にしていく! 2
  4. 4. 大手町.rb #12 「Rakeについて」 今日のテーマ Rake について Ruby on Rails でも標準的に使われている とはいえ、時間をとって学ぶことがあまりない というのも事実 ドキュメントを熟読すればいいのですが、 なかなか上から読むのは大変です。 今日は一緒に学んでいきましょう 3
  5. 5. 大手町.rb #12 「Rakeについて」 ビルドツールの主な使い方 ビルド 定義されたルールに従った処理(コンパイルなど) ex) *.c を *.o にコンパイル 依存関係の処理があるときに便利 ex) hello.c と hello.h のどちらかが更新されていた場合 コンパイルを実行し、 hello.o を再作成 一部を書き換えたときに、必要な作業のみを実施可能 ex) hello.c だけが変更がある場合は、hello.o を再作成 タスク 事前に登録した任意の作業を実施 Rails での例 データベース処理(マイグレートなど) テスト キャッシュやログなどのクリア ドキュメント生成など 4
  6. 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. 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. 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. 9. 大手町.rb #12 「Rakeについて」 A. Rakeクイズ 解説 (1) 表示内容の違い Rake を利用すると、豊富なデバッグメッセージを利用できます。 実行したコマンド内容が逐次確認できて便利です。なお、 とすると、実行コマンドの表示を抑止できます。 (2)実行可否の違い Rake の sh は、失敗時に自動的にエラーメッセージを表示して スクリプトの処理が異常終了し、それ以降の処理を実行しません。 この動作は、多くのバッチ処理で期待される動作です。 シェルスクリプトや system コマンドなどでは本来しなければ ならなかった異常終了させることを忘れ、困った結果になったりします。 しかしながら、Rake の sh を使えば異常終了を忘れることはありません。 8 > rake –q > rake –sまたは
  10. 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. 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. 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. 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. 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. 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. 16. 大手町.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
  17. 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. 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. 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. 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. 21. 大手町.rb #12 「Rakeについて」 発展的な話題 下記は興味があるなら自分で調べてみましょう multitask 複数のタスクを並列実行する rake/gempackagetask Gem のパッケージを作成するためのタスク rake/packagetask tar.gz, zip などのパッケージを作成するためのタスク rake/rdoctask rdoc のドキュメンテーションを作成するタスク rake/testtask ユニットテストを実行するタスクを作成する 20
  22. 22. 大手町.rb #12 「Rakeについて」 まとめ Rake を使うと、エラー処理を記述不要で楽 sh を使えば、エラー時の処理停止が自動的に行われる 定義されたルールから依存関係を自動解決可能 コンパイル、テキスト処理、他多数のコマンドに応用可能 複雑なタスクも記述可能 依存ファイルの推定ロジックのカスタマイズ タスク処理中での別のタスクの呼び出し 任意の Ruby スクリプトも記述可能 ファイル名を動的に取得可能 標準的なRake タスクも require により用意可能 クリーニング 21
  23. 23. ご清聴ありがとう ございました

×