Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rake: Not Your Father's Build Tool

Rake: Not Your Father's Build Tool

Presented at Utah Valley Ruby User Group, Tyler Bird talked about the Rake build tool and the historical conception and basic usage of the tool.

Tyler Bird

June 14, 2011
Tweet

More Decks by Tyler Bird

Other Decks in Programming

Transcript

  1. What’s in a name? • Usually the first thing people

    learn about rake is the etymology of the name: “Ruby Make”.
  2. What’s in a name? • Usually the first thing people

    learn about rake is the etymology of the name: “Ruby Make”. • But it’s much more than a catchy turn of phrase.
  3. What’s in a name? • Usually the first thing people

    learn about rake is the etymology of the name: “Ruby Make”. • But it’s much more than a catchy turn of phrase. • It’s a fully featured Build Language. That almost never existed...
  4. Ruby Version of Make? • Jim tells the birth of

    rake as code he never intended to write.
  5. Ruby Version of Make? • Jim tells the birth of

    rake as code he never intended to write. • It started with a simple itch to scratch...
  6. Jim Thought “What if...” "What if you could specify the

    make tasks in Ruby, like this ..." task "build" do java_compile(...args, etc ...) end "The task function would register "build" as a target to be made, and the block would be the action executed whenever the build system determined that it was time to do the build target."
  7. 100 Lines Later • It worked! • Rake’s prototype lives

    in the repo: doc/proto_rake.rdoc • But it didn’t have timebased file dependencies... so back to the text-editor.
  8. 100 Lines Later • It worked! • Rake’s prototype lives

    in the repo: doc/proto_rake.rdoc • But it didn’t have timebased file dependencies... so back to the text-editor. • And the rest is in the commit history.
  9. A Build Language • The basic unit of a build

    language are tasks. • A build has source files that it uses to produce a desired product.
  10. A Build Language • The basic unit of a build

    language are tasks. • A build has source files that it uses to produce a desired product. • The two most common other build languages are make and ant.
  11. Comparison make ant rake Imperative Style Imperative Style Dependency Based

    External DSL External DSL Internal DSL Custom Syntax XML based Syntax Ruby Syntax
  12. Imperative Style • Both the code_generation methods will be called

    during test. • At best that will waste time. • At worst that can produce undesired results.
  13. Dependency Based • A dependency based system gives the test

    method the power to evaluate what prerequisites it has. • Then because ruby can evaluate the code without running it, it can prepare it to be run in the correct order that will only run each task once.
  14. Comparison make ant rake Imperative Style Imperative Style Dependency Based

    External DSL External DSL Internal DSL Custom Syntax XML based Syntax Ruby Syntax
  15. External vs Internal DSL • With make and ant you

    need to use external scripts or nasty syntax to be creative.
  16. Building Blocks of Rake • task • file • directory

    • namespace • multitask • FileUtils
  17. Building Blocks of Rake • task • file • directory

    • namespace • multitask • FileUtils • clean
  18. Building Blocks of Rake • task • file • directory

    • namespace • multitask • FileUtils • clean • clobber
  19. task In the DSL of rake, a task is a

    method that takes two arguments. The first argument is a hash, and the second is a block.
  20. file Rake file tasks are most similar to tasks in

    make. They get run only when needed. File tasks are declared using a string rather than a symbol. The following file task creates a executable program (named prog) given two object files name a.o and b.o.
  21. directory It is common to need to create directories upon

    demand. The directory convenience method is a short-hand for creating a FileTask that creates the directory.
  22. directory The directory method does not accept prerequisites or actions,

    but both prerequisites and actions can be added later.
  23. multitask Multitask can help you save time by running tasks

    in your build that are safe to run in parallel.
  24. multitask It even has the ability to determine any prerequisites

    that need to be run before hand. It will complete this prep_for_copy only once then the three tasks would begin to run together.
  25. FileUtils • Use the FileUtils module and rake gives you

    the most common filesystem commands: • cd, pwd, mkdir, mkdir_p, rmdir, ln, ln_s, ln_sf, cp, cp_r, mv, rm, rm_r, rm_rf, install, chmod, touch • Create a map of files with FileList: • FileList[‘**/*.rb’].each {|f| puts f}
  26. Clean/Clobber • require 'rake/clean' • Use a pair of file

    lists: CLEAN and CLOBBER. • You can then add items to the file lists with expressions like CLEAN.include('*.o'). • Remember that the clean task removes everything in the clean list, and clobber removes everything in both lists.
  27. Built In Tasks • GemPackageTask (in Ruby Gems now) •

    PackageTask • RdocTask (in Rdoc now) • TestTask
  28. Rake & Rails • The default task for a rails

    project runs your test suite.
  29. Rake & Rails • The default task for a rails

    project runs your test suite. • If you want to see how the rake tasks you enjoy with Rails are built search for .rake in the gem source.
  30. Rake & Rails • The default task for a rails

    project runs your test suite. • If you want to see how the rake tasks you enjoy with Rails are built search for .rake in the gem source. • Because as we all know, Rails is Magic!
  31. rake • Jim Weirich created in 2003. • Similar to

    make and ant. With the power of Ruby. • Hope you’ve got some ideas on how you’d like to use it.
  32. Credits • Jim Weirich - Rake http://rake.rubyforge.org/ • Martin Fowler

    - Using the Rake Build Language http://martinfowler.com/articles/rake.html • Josh Nichols - Rake: The Familiar Stranger http://vimeo.com/2496890