Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Rake

489 visualizaciones

Publicado el

about Rakefile, Rake of Ruby build tool

Publicado en: Tecnología
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

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. ご清聴ありがとう ございました

×