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 code
diretó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 autoload
constantes 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 primeiraload
chamada - se você definir constantes na fonte que está
load
usando, 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