Slide 1

Slide 1 text

Introduc)on to Rake Eric Hodel – @drbrain

Slide 2

Slide 2 text

What is Rake? • Build automa)on tool • Dependency-oriented

Slide 3

Slide 3 text

Jim Weirich

Slide 4

Slide 4 text

Other “rake”s • make family • Java: ant, maven • Clojure: leiningen • Scala: sbt • Python: A-P-P

Slide 5

Slide 5 text

Rake Basics

Slide 6

Slide 6 text

Rake Task task "test" do # test actions # … end

Slide 7

Slide 7 text

Dependencies task "test" => ["compile"] do # test actions # … end

Slide 8

Slide 8 text

Dependencies task test: "compile" do # test actions # … end

Slide 9

Slide 9 text

Special Tasks MRUBY_DOWNLOAD = "tmp/mruby-1.2.0.tgz" directory "tmp" file MRUBY_DOWNLOAD => "tmp" do sh "curl", "-o", MRUBY_DOWNLOAD, … end

Slide 10

Slide 10 text

Namespacing namespace "test" do task "unit" # test:unit task "functional" # test:functional end namespace "db" do task "create" # db:create end

Slide 11

Slide 11 text

Namespacing namespace "test" do task "unit" task "functional" end task "test" => [ "test:unit", "test:functional" ]

Slide 12

Slide 12 text

Documenta)on desc "Run the tests" task "test" do # … end

Slide 13

Slide 13 text

Default Task task "default" do puts "this task runs by default" end

Slide 14

Slide 14 text

Default Task $ rake this task runs by default $

Slide 15

Slide 15 text

Programming with Rake

Slide 16

Slide 16 text

task "default" => "test" task "test" => [MRUBY_EXE, "tmp"] file MRUBY_EXE => MRUBY_DOWNLOAD directory "tmp" file MRUBY_DOWNLOAD => "tmp"

Slide 17

Slide 17 text

Unordered is OK task "default" => "test" task "test" => MRUBY_EXE task "test" => MRUBY_EXE task "default" => "test" SAME

Slide 18

Slide 18 text

Dependencies default test MRUBY_EXE MRUBY_ DOWNLOAD tmp

Slide 19

Slide 19 text

Running rake $ rake # runs default task $ rake test # runs test task $ rake test default # runs both $ rake -t # traces execution $ rake -t test # traces test task $ rake -T # show descriptions

Slide 20

Slide 20 text

Invoke & Execute Invoke checks dependencies Execute runs ac)ons (ac)ons run only once)

Slide 21

Slide 21 text

$ rake -t ** Invoke default (first_time) ** Invoke test (first_time) ** Invoke tmp/mruby-1.2.0/bin/mruby (first_time) ** Invoke tmp/mruby-1.2.0.tgz (first_time) ** Invoke tmp (first_time) ** Execute tmp mkdir -p tmp ** Execute tmp/mruby-1.2.0.tgz ** Execute tmp/mruby-1.2.0/bin/mruby mkdir -p tmp/mruby-1.2.0/bin/mruby ** Invoke tmp (not_needed) ** Execute test ** Execute default default test MRUBY_EXE MRUBY_ DOWNLOAD tmp

Slide 22

Slide 22 text

Rake Library

Slide 23

Slide 23 text

Shell commands cd MRUBY_DIR do end sh "curl", "-o", MRUBY_DOWNLOAD, … ruby "my_script.rb" mv "a.txt", "b.txt" rm_rf "tmp"

Slide 24

Slide 24 text

Execu)on directory task "current_directory" do puts "rake's current directory is #{Dir.pwd}" end

Slide 25

Slide 25 text

Execu)on directory $ rake current_directory rake's current directory is ~/tmp/rake-example $ cd lib $ rake current_directory (in ~/tmp/rake-example) rake's current directory is ~/tmp/rake-example

Slide 26

Slide 26 text

FileList markdown_files = FileList["*.md"] # => ["ch1.md, "ch2.md", …] html_files = markdown_files.ext "html" # => ["ch1.html, "ch2.html", …]

Slide 27

Slide 27 text

import (require) import "tasks/build.rake" import "tasks/test.rake"

Slide 28

Slide 28 text

Best Prac)ces

Slide 29

Slide 29 text

One Thing per Task file MRUBY_EXE => MRUBY_DOWNLOAD do # 1. unpack MRUBY_DOWNLOAD # 2. build mruby end

Slide 30

Slide 30 text

One Thing per Task MRUBY_DIR = "tmp/mruby-1.2.0" directory MRUBY_DIR => MRUBY_DOWNLOAD do # unpack MRUBY_DOWNLOAD end file MRUBY_EXE => MRUBY_DIR do # build mruby end

Slide 31

Slide 31 text

Make Aliases MRUBY_EXE = "tmp/mruby-1.2.0/bin/mruby" task "test" => MRUBY_EXE file MRUBY_EXE => MRUBY_DIR

Slide 32

Slide 32 text

Make Aliases MRUBY_EXE = "tmp/mruby-1.2.0/bin/mruby" task "test" => "mruby" task "mruby" => MRUBY_EXE file MRUBY_EXE => MRUBY_DIR

Slide 33

Slide 33 text

Document desc "Run tests" task "default" => "test" desc "Run tests" task "test" => "mruby" desc "Build mruby" task "mruby" => MRUBY_EXE

Slide 34

Slide 34 text

Document $ rake -T rake default # Run tests rake mruby # Build mruby rake test # Run tests

Slide 35

Slide 35 text

Organize namespace related tasks make separate .rake files import those files

Slide 36

Slide 36 text

Organize $ grep rake Rakefile rakefiles = FileList['tasks/*.rake'] import(*rakefiles) $ find . -iname "*rake*" ./Rakefile ./tasks/test.rake

Slide 37

Slide 37 text

Advanced Rake

Slide 38

Slide 38 text

Re-declare tasks task "test" => "mruby" task "test" do # run tests end tests = FileList["test/*.rb"] task "test" => tests

Slide 39

Slide 39 text

rake/clean require 'rake/clean' # remove temporary files CLEAN << "*.o" << "*.class" # rake clean # remove generated files CLOBBER << "*.so" << "*.jar" # rake clobber

Slide 40

Slide 40 text

rule Generates output Turns file X into file Y

Slide 41

Slide 41 text

rule rule ".html" => ".md" do |t| sh "md2html", t.source, t.name end task "default" => html_files # md2html ch1.md ch1.html # md2html ch2.md ch1.html BACKWARD

Slide 42

Slide 42 text

Advanced import file "some.rake" => "do_this_first" import "some.rake"

Slide 43

Slide 43 text

Task Arguments task "name", [:first, :last] do |t, args| args.with_defaults first: "Jamie", last: "Smith" puts "First name is #{args[:first]}" puts "Last name is #{args[:last]}" end

Slide 44

Slide 44 text

Task Arguments $ rake name First name is Jamie Last name is Smith $ rake name[Eric,Hodel] First name is Eric Last name is Hodel

Slide 45

Slide 45 text

Task Arguments $ rake name[Eric, Hodel] rake aborted! Don't know how to build task 'name[Eric,' (see --tasks)

Slide 46

Slide 46 text

h`ps:/ /github.com/ruby/rake