sed 's/Make/Rake/g'

Comecei a aprender Rails. Estava lendo sobre Rakefile e achei a ideia excelente. Sempre usei Make mas encontrava muitas limitações. Resolvi aprender rake.

Eu tenho um projeto de escrever um livro técnico e como bom programador comecei a fazer o script de build antes de escrever o livro. Escrevi usando o make e pandoc para gerar os artefatos. Ficou assim:

CC=pandoc
BROWSER=google-chrome 
CFLAGS=—highlight-style pygments
MDFILES:= $(wildcard src/*.md)
HTMLFILES:= $(addprefix out/,$(notdir $(MDFILES:.md=.html)))

all:  $(HTMLFILES)
 echo $<

epub: src/introducao.md
 $(CC) -S $(CFLAGS) -o out/book.epub src/title.txt $<
 ls out

out/%.html: src/%.md  
 $(CC) -s $(CFLAGS) -o [email protected] -i $<
 $(BROWSER) [email protected]

clean:  
 rm -f out/*.html

Obs: repara os nomes de variáveis anacontextuais.

Achei um tutorial sobre rake e para minha surpresa ele fazia exatamente a mesmo coisa que eu estava fazendo com o make, o que tornou minha tarefa mais simples. Meu Rakefile ficou assim:

source_files = FileList.new("src/*.md")

task :default => :html
task :html => source_files.pathmap("out/%n.html")

rule ".html" => ->(f){source_for_html(f)} do |task|
mkdir_p task.name.pathmap("%d") # ensure that the path exist
sh "pandoc -s —highlight-style pygments -o #{task.name} #{task.source}"
sh "google-chrome #{task.name}"
end

task :clean do
rm_rf "out"
end

def source_for_html(html_file)
html_file.pathmap("src/%n.md")
end

Eu ainda não sei se essa é a melhor maneira de fazer. Com o tempo eu pretendo melhorar esse Rakefile. Eu especialmente não gosto de usar o source_for_html.

Existem várias vantagens de usar rake ao invés de make (principalmente para projetos não C/C++):

  • É possível usar ruby para fazer coisas mais complexas em cada regra;
  • Não é preciso se preocupar com tabs, espaços e as regras malucas do make;
  • É muito mais fácil de depurar o Rakefile;
  • Rake é mais moderno e suportado, então é possível achar resoluções para novos problemas que surgem.

Se tu quiseres saber mais eu recomendo a série de vídeos de Avdi Grimm e o artigo do Martin Fowler sobre rake.