Execute um rakefile como um script bash

Isso pode ser uma loucura, mas acontece que você pode executar um arquivo como um script bash que então executa a si mesmo como um rakefile (ou um script ruby ​​regular em princípio) assim.

#!/usr/bin/env bash
sleep
0
=begin 2> /dev/null
exec rake -f $0 $@
=end

desc
'The tasks at hand'

task
:hello do
puts
"hello to you too!"
end

O que está acontecendo aqui é que quando o script é executado por bash, ele executa as linhas 2 e 3 como uma única linha que invoca o comando sleep like sleep 0 =begine canaliza o erro resultante para /dev/nullcomo se nada tivesse acontecido. Em seguida, ele invoca execpara substituir o processo atual por rake executando o mesmo arquivo com os mesmos argumentos.

Quando o rake / ruby ​​lê o arquivo, ele ignora o shebang na linha um, vê sleep 0qual é válido e não faz essencialmente nada na linha 2, então vê uma citação de bloco que ele ignora nas linhas 3-5 antes de passar para o código ruby.

Sim, é menos eficiente, mas a diferença não é significativa em comparação com o tempo gasto para invocar o rake (> 100ms).

Na maioria dos casos, é provavelmente melhor escrever um arquivo rake regular e criar um apelido como alias foo='rake -f ~/bin/foo'ou algo assim , mas caso isso não funcione para você, esse hack pode ajudar.