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 =begin
e canaliza o erro resultante para /dev/null
como se nada tivesse acontecido. Em seguida, ele invoca exec
para 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 0
qual é 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.