16

Wie ich es verstehe, werden Plugins nicht in Rails mit jeder Anfrage im Entwicklungsmodus neu geladen. Das ist sinnvoll, da Sie in der Regel Plugins zu Ihrer App hinzufügen und es sich um die App handelt, die Sie entwickeln.Wie kann ich mein Plugin zwingen, bei jeder Anfrage neu zu laden?

Wenn Sie jedoch ein Plugin entwickeln, müssen Sie den Server bei jeder Änderung des Plugins neu starten, was einen erheblichen Overhead verursacht.

Gibt es eine Möglichkeit, dass Rails Ihr Plugin während der Entwicklung neu laden kann, wie es Ihre Modelle und Controller neu lädt?

+0

das gleiche Problem. Die aktuellen Antworten sind entweder nicht akzeptabel oder funktionieren nicht. – drewrobb

Antwort

1

Wenn der Server automatisch neu gestartet wird, wenn sich der Plugin-Code ändert, können Sie Mike Clark/topfunkys rstakeout dafür verwenden, oder den neueren watchr, der klingt, als ob er dasselbe tut.

Sie würden so etwas tun:

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

Guard ist auch ein eine gute Lösung, Dateien auf Änderungen zu beobachten. Das Guard-Passanger-Plugin startet den Server neu, wenn sich Dateien ändern: https://github.com/mordaroso/guard-passenger – Kris

1

einfache Weise entwickeln Ihr Plugin in einem Ordner innerhalb des "app" Ordner:

  • App
    • Modelle
    • Controller
    • Helfer
    • Ansichten
    • your_plugin_hier

Auf diese Weise alle Ihre Plugin Klassen werden bei jeder Anfrage neu geladen werden.

Eine andere Möglichkeit ist es, den Weg zu Ihrer application.rb Datei hinzufügen:

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 

Auf diese Weise Ihr Plugin die ganze Zeit werden wird neu geladen.

+0

das ist, was ich verwendet habe, aber es scheint nicht die beste Lösung – msaspence

+0

welche Art von Lösung möchten Sie? –

+0

Wenn ein Weg, der Sie nicht fragt, etwas zu konfigurieren und nur funktioniert, ist nicht die beste Lösung, ich habe keine Ideen. –

3

Ich mache das mit der Schrotflinte gem.

gem install shotgun

cd /path/to/rails/app

shotgun

langsame Reaktionszeit, aber Neuladen des gesamte Code Schienen, keine Zeit verschwenden autoload_paths

+0

Mein Gott, das ist erstaunlich. Vielen Dank. –

9

ich seit einiger Zeit mit diesem habe kämpfen, um zu schreiben, auch. Keine der Lösungen funktioniert, einschließlich der autoload_paths und autoload_once_paths Tricks. Außerdem hilft der Hack mit FileUpdateChecker und Initializern auch nicht (der Checker löst richtig aus, aber die Dateien werden nicht neu geladen). Gleich für config.reload_plugins = true ...

Es gibt jedoch eine Lösung. In app/controllers/application_controller.rb fügen Sie eine Zeile hinzu: require_dependency 'your_file_name_here' Der Anwendungscontroller ist bei jeder Anforderung neu geladen und require_dependency macht Ihre Datei auf Änderungen überprüft und entsprechend neu geladen. Es funktionierte für mich, Apache 2, Passenger 3 und Rails 3.0.3.

+0

In einem zweiten Durchlauf funktioniert config.reload_plugins = true für mich. – drewrobb

+0

require_dependency hat für mich funktioniert. Da mein Plugin wiederum eigene Dateien benötigt, musste ich diese require-Anweisungen durch require_dependency ersetzen ... –

+0

Ich vermute, reload_plugins hat nicht funktioniert, weil ich vermutlich die Dateien falsch eingerichtet habe und sie nicht geladen werden durch Schienen automatisch, erfordert stattdessen eine manuelle 'require'-Anweisung. http://stackoverflow.com/questions/1073076/rails-lib-modules-and –

0

Mit https://github.com/ranmocy/guard-rails, dann ist es super einfach:

# 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

Diese Lösung, für Motoren, arbeitet auf Rails 2.3, sondern kommt mit einem cavaet, wird es lade alle Dateien in der Engine und der übergeordneten App bei jeder Anfrage, wodurch die Antwortzeiten langsamer werden.

# 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 

Danach starten Sie den Server:

RELOAD_MYENGINE=1 rails server