16

Come ho capito, i plugin non vengono ricaricati in Rails con ogni richiesta in modalità sviluppo. Il che ha senso, dato che in genere aggiungi plug-in alla tua app ed è l'app che stai sviluppando.Come posso forzare il mio plugin a ricaricare con ogni richiesta?

Ma se si sta sviluppando un plug-in, è necessario riavviare il server a ogni modifica apportata al plug-in che ha un sovraccarico significativo.

C'è un modo per rendere Rails ricaricare il plugin durante lo sviluppo, il modo in cui ricarica i vostri modelli e controllori?

+0

avendo lo stesso problema. Le risposte attuali non sono accettabili o non funzionano. – drewrobb

risposta

1

Se il riavvio del server automaticamente quando il codice del plugin cambia è una soluzione accettabile, è possibile utilizzare Mike Clark/topfunky rstakeout per quello o il più recente watchr che suona come se facesse la stessa cosa.

Si potrebbe fare qualcosa di simile:

rstakeout 'touch tmp/restart.txt' 'vendor/plugins/**/*' 
+1

La guardia è anche un buona soluzione per guardare i file per le modifiche. Il plugin guard-passenger riavvia il server quando i file cambiano: https://github.com/mordaroso/guard-passenger – Kris

1

Facile modo, sviluppare il vostro plugin in una cartella all'interno della "app" cartella:

  • app
    • modelli
    • controllori
    • aiutanti
    • vista
    • your_plugin_here

In questo modo, tutte le classi del plugin saranno ricaricati ad ogni richiesta.

Un'altra possibilità è quella di aggiungere il percorso al file application.rb:

require File.expand_path('../boot', __FILE__) 
require 'rails/all' 
Bundler.require(:default, Rails.env) if defined?(Bundler) 

module SunspotTutorial 
    class Application < Rails::Application 

    config.autoload_paths += %W{ #{config.root}/plugins/your_plugin_name/lib } 

    #lots of other code 
    end 
end 

In questo modo il plugin sta per essere ricaricato tutto il tempo.

+0

questo è quello che ho fatto ma non sembra la soluzione migliore – msaspence

+0

che tipo di soluzione vuoi? –

+0

Se un modo che non ti chiede di configurare nulla e funziona solo non è la soluzione migliore, sono fuori di idee. –

3

Lo faccio usando la gemma del fucile da caccia.

gem install shotgun

cd /path/to/rails/app

shotgun

più lento tempo di risposta, ma ricaricare tutto il codice rotaie, senza perdere tempo a scrivere autoload_paths

+0

Mio Dio, questo è fantastico. Grazie. –

9

ho lottato con questo per un certo tempo, pure. Nessuna delle soluzioni funziona, compresi i trucchi autoload_paths e autoload_once_paths. Inoltre, l'hack con FileUpdateChecker e inizializzatori anche non aiuta (il controllo innesca correttamente, ma i file non vengono ricaricati). Lo stesso per config.reload_plugins = true ...

Tuttavia, c'è una soluzione. In app/controllers/application_controller.rb aggiungere una riga: require_dependency 'your_file_name_here' Il controller di applicazione è ricaricato su ogni richiesta e require_dependency rende il file da controllare per le modifiche e ricaricato di conseguenza. Ha funzionato per me, Apache 2, Passenger 3 e Rails 3.0.3.

+0

In una seconda passata, config.reload_plugins = true funziona per me. – drewrobb

+0

require_dependency ha funzionato per me. Inoltre, poiché il mio plugin richiede a sua volta i propri file, ho dovuto sostituire quelli che richiedono istruzioni con require_dependency ... –

+0

Sospetto che reload_plugins non abbia funzionato perché presumibilmente ho i file impostati errati e non vengono caricati per rotaia automaticamente, richiedendo invece una dichiarazione manuale 'richiede'. http://stackoverflow.com/questions/1073076/rails-lib-modules-and –

0

Con https://github.com/ranmocy/guard-rails, è super facile:

# Gemfile.local 
gem 'guard-rails' 


$ bundle 
$ guard init rails 


# Guardfile: 
guard 'rails' do 
    watch('Gemfile.lock') 
    watch(%r{^(config|plugins)/.*}) 
end 


$ bundle exec guard 
0

Questa soluzione, per i motori, funziona su Rails 2.3, ma viene fornito con un cavaet, lo farà carica tutti i file nel motore e nell'app padre in ogni richiesta, riducendo i tempi di risposta.

# lib/my_engine/engine.rb 
if ENV['RELOAD_MYENGINE'] && Rails.env.development? 
    config.to_prepare do 
    Rails.logger.debug "RELOADING MY ENGINE" 
    require_dependency MyEngine::Engine.root.join('lib', 'my_engine').to_s 
    end 

config.after_initialize do 
    Rails.application.config.reload_classes_only_on_change = false 
end 

quindi avviare il server:

RELOAD_MYENGINE=1 rails server