Ejecute un rakefile como un script bash

Esto puede ser una locura, pero resulta que puede ejecutar un archivo como un script bash que luego se ejecuta como un rakefile (o un script ruby ‚Äč‚Äčnormal en principio) as√≠.

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

desc
'The tasks at hand'

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

Lo que sucede aquí es que cuando bash ejecuta el script, ejecuta las líneas 2 y 3 como una sola línea que invoca el comando sleep like sleep 0 =beginy canaliza el error resultante /dev/nullcomo si nada hubiera pasado. Luego invoca execpara reemplazar el proceso actual con rake ejecutando el mismo archivo con los mismos argumentos.

Cuando rake / ruby ‚Äč‚Äčlee el archivo, ignora el shebang en la l√≠nea uno, ve sleep 0cu√°l es v√°lido y no hace esencialmente nada en la l√≠nea 2, luego ve una cita en bloque que ignora en las l√≠neas 3-5 antes de pasar al c√≥digo ruby.

Sí, es menos eficiente, pero la diferencia no es significativa en comparación con el tiempo necesario para invocar el rake (> 100 ms).

En la mayoría de los casos, probablemente sea mejor escribir un rakefile regular y crear un alias como alias foo='rake -f ~/bin/foo'o lo que sea, pero en caso de que eso no funcione para usted, este truco podría ayudar.