Mir ist Folgendes aufgefallen:
Voller Motor
Bei einer vollständigen Engine erbt die übergeordnete Anwendung die Routen von der Engine. Es ist nicht erforderlich, etwas in anzugeben parent_app/config/routes.rb
. Die Angabe des Edelsteins in Gemfile reicht aus, damit die übergeordnete App die Modelle, Routen usw. erben kann. Die Engine-Routen werden wie folgt angegeben:
# my_engine/config/routes.rb
Rails.application.routes.draw do
# whatever
end
Kein Namespace von Modellen, Controllern usw. Diese sind für die übergeordnete Anwendung sofort verfügbar.
Montierbarer Motor
Der Namespace der Engine ist standardmäßig isoliert:
# my_engine/lib/my_engine/engine.rb
module MyEngine
class Engine < Rails::Engine
isolate_namespace MyEngine
end
end
Mit einer montierbaren Engine haben die Routen einen Namespace und die übergeordnete App kann diese Funktionalität unter einer einzigen Route bündeln:
# my_engine/config/routes.rb
MyEngine::Engine.routes.draw do
#whatever
end
# parent_app/config/routes.rb
ParentApp::Application.routes.draw do
mount MyEngine::Engine => "/engine", :as => "namespaced"
end
Modelle, Controller usw. sind von der übergeordneten Anwendung isoliert - obwohl Helfer problemlos gemeinsam genutzt werden können.
Dies sind die Hauptunterschiede, die ich entdeckt habe. Vielleicht gibt es noch andere? Ich habe gefragt , über hier , haben aber noch keine Antwort zu erhalten.
Mein Eindruck ist, dass eine vollständige Engine sich nicht von der übergeordneten Anwendung isoliert und daher am besten als eigenständige Anwendung neben der übergeordneten Anwendung verwendet wird. Ich glaube, dass Namenskonflikte auftreten können.
Eine montierbare Engine kann in Situationen verwendet werden, in denen Sie Namenskonflikte vermeiden und die Engine in der übergeordneten Anwendung unter einer bestimmten Route bündeln möchten. Zum Beispiel arbeite ich daran, meinen ersten Motor für den Kundenservice zu bauen. Die übergeordnete Anwendung kann ihre Funktionalität unter einer einzigen Route bündeln, z. B.:
mount Cornerstone::Engine => "/cornerstone", :as => "help"
Wenn ich in meinen Annahmen weit davon entfernt bin, lassen Sie es mich bitte wissen und ich werde diese Antwort korrigieren. Ich habe einen kleinen Artikel über das Thema gemacht hier Cheers!
mount MyEngine::Engine => "/"
. Es funktioniert für Ressourcen, vielleicht ist das auch für Motoren der Fall.Beide Optionen erzeugen einen Motor . Der Unterschied besteht darin, dass
--mountable
die Engine in einem isolierten Namespace erstellt wird, während--full
eine Engine erstellt wird, die den Namespace der Hauptanwendung gemeinsam nutzt.Die Unterschiede werden auf drei Arten manifestiert:
1) Die Engine-Klassendatei ruft Folgendes auf
isolate_namespace
:lib / my_full_engine / engine.rb:
lib / my_mountable_engine / engine.rb:
2) Die
config/routes.rb
Datei der Engine wird mit einem Namespace versehen:Voller Motor:
Montierter Motor:
3) Die Dateistruktur für Controller, Helfer, Ansichten und Assets wird mit einem Namespace versehen:
Erläuterung
Der Anwendungsfall für die
--full
Option scheint sehr begrenzt zu sein. Persönlich kann ich mir keinen guten Grund vorstellen, warum Sie Ihren Code in eine Engine trennen möchten, ohne auch den Namespace zu isolieren. Im Wesentlichen erhalten Sie nur zwei eng gekoppelte Anwendungen, die identische Dateistrukturen und alle Konflikte und Codeverluste gemeinsam nutzen das bedeutet.Jede Dokumentation, die ich gesehen habe, demonstriert die
--mountable
Option, und in der Tat empfiehlt Ihnen die aktuelle Kantenführung dringend, sie einzuschließenisolate namespace
- was dasselbe ist, als würde man "Verwendung--mountable
über" sagen--full
.Schließlich gibt es Terminologie-Verwirrung:
rails plugin -h
Zeigt leider die folgenden Beschreibungen:Dies erweckt den Eindruck, dass Sie
--full
eine "Engine"--mountable
erstellen und etwas anderes erstellen, das als "montierbare Anwendung" bezeichnet wird, obwohl es sich tatsächlich um beide Engines handelt - eine mit Namespace und eine ohne. Dies führt zwangsläufig zu Verwirrung, da Benutzer, die eine Engine erstellen möchten, wahrscheinlich davon ausgehen, dass dies--full
die relevantere Option ist.Fazit
rails plugin new something --full
= Engine im Namespace Ihrer App. (Warum würdest du?)rails plugin new something --mountable
= Engine mit eigenem Namespace. (Genial)Verweise
quelle
--full
: Wenn Sie Teile einer Rails-Website haben, möchten Sie diese integrieren (nicht in einem isolierten Namespace) und dennoch zwischen verschiedenen Rails-Projekten teilen. Es kann auch einfacher sein: Vielleicht fügt Ihr Edelstein nicht so viel hinzu, aber Sie möchten es richtig einhaken können.Admin::AdminService.some_action
aber Ihre Routen nicht ändern müssen, wenn andere clientseitige Anwendungen wie eine Ember-App die Routen verwenden, die sich auf den von Ihnen verwendeten Code beziehen isolieren wollen. --full scheint ein Zwischenschritt zu sein, der möglicherweise einfacher zu implementieren ist.Ich habe mich das gleiche gefragt und bin daher hier gelandet. Es scheint mir, dass die früheren Antworten im Wesentlichen die Frage abdecken, aber ich dachte, dass das Folgende auch helfen könnte:
Von besonderem Interesse (für mich) ist die Tatsache, dass es keinen Unterschied zwischen gibt
und
quelle
--full
Vorrang vor hat--mountable
?Ich verstehe den Unterschied darin, dass Engines wie Plugins sind und vorhandenen Anwendungen Funktionen hinzufügen. Mountbare Apps sind im Wesentlichen eine Anwendung und können eigenständig sein.
Wenn Sie es also alleine oder in einer anderen Anwendung ausführen möchten, erstellen Sie eine bereitstellbare App. Wenn Sie beabsichtigen, dass es eine Ergänzung zu vorhandenen Anwendungen ist, aber nicht von selbst ausgeführt wird, würden Sie es zu einer Engine machen.
quelle
Ich glaube, der Unterschied besteht darin, dass die bereitstellbaren Apps von der Host-App isoliert sind, sodass sie keine Klassen gemeinsam nutzen können - Modelle, Helfer usw. Dies liegt daran, dass eine bereitstellbare App ein Rack-Endpunkt ist (dh eine eigenständige Rack-App) ).
Haftungsausschluss: Ich habe, wie die meisten, gerade erst angefangen, mit Rails 3.1 zu spielen.
quelle