Recarregue um único arquivo de origem de dependência de gem

Você está dentro do console Rails, desenvolvendo o aplicativo e um framework correspondente localizado em um gem separado.

Você tem um link simbólico em seu codediretório apontando para a árvore de origem da gema $GEM_HOME(ou, melhor ainda, você está usando meu truque do bundler ;-)). De qualquer forma – seus arquivos de origem de gemas podem ser acessados ​​via em ../gemname/lib/gem_name/relação ao seu aplicativo.

Se você mudar a fonte da gema, terá que reiniciar todo o console Rails – perdendo pelo menos 10 segundos para cada mudança.

Não é mais – basta usar Kernel.load:

>> load '../gemname/lib/gem_name/changed_file.rb'
>> reload!

Por que isso funciona? Porque o reload!helper do Rails undefine todas as autoloadconstantes ed, e então recarrega seus arquivos fonte – e quando seus fontes são recarregados, qualquer metaprogramação realizada por sua gem será invocada novamente, redefinindo métodos e coisas dentro de suas classes.

Perigo, Will Robinson

  • se você fizer coisas desagradáveis ​​(tm) em sua gema, como alterar a hierarquia de classes, você obterá superclass mismatch.
  • se você não fizer metaprogramação em sua gem, você pode pular o reload!– já que os módulos e classes da gem serão atualizados na primeira loadchamada
  • se você definir constantes na fonte que está loadusando, receberá avisos – é claro.

Resultado

Ruby é verdadeiramente dinâmico – gosto de pensar nele como um sistema UNIX: muito raramente ele precisa ser reiniciado: sempre há uma maneira de consertar as coisas evitando uma reinicialização a frio – e aprender a fazer isso é muito divertido :-).

~vjt