2010-11-18 5 views
8

Unser Unternehmen begann mit einem einzigen Produkt, einer Rails-App, die von einigen Java-Services unterstützt wurde. Dann entschied man sich für ein anderes Produkt, das sich zunächst deutlich von dem ersten unterschied, aber im Laufe der Zeit Wir haben festgestellt, dass sie konvergieren, und wenn Sie einen Code in einen Code ändern, müssen Sie einen ähnlichen Code ändern, um einen neuen Feature/Bug-Fix zu erhalten. Dies wird offensichtlich zu einem Schmerz.Kombination von 2 Rails-Apps zu einer einzigen Codebasis

In einigen Fällen wir Edelsteine, die einen Teil dieser Funktionalität teilen, aber es geht über Rubin in Javascript, CSS etc ..

So bin ich mit Zusammenführung dieser beiden Anwendungen in einer Code-Basis beauftragt. Ich denke, wir würden uns wünschen, dass es eine einzige App mit einem permissionbasierten Rollenzugriff ist, aber das wird viel später kommen.

Mein erster Gedanke, sie schnell zusammen zu bringen, ist, zwei Rails-Engines zu erstellen und gemeinsame libs zwischen ihnen zu teilen. Ich denke, das ist der schnellste Weg, den Code zu kombinieren, gemeinsame Abschnitte zu finden und mit dem Teilen zu beginnen.

Mein erstes Problem ist jedoch, wie man zwischen den Apps routet. Eine App verwendet einen einzelnen Domainnamen, der sich nie ändert, die andere App hat viele Domains. Kann jemand vorschlagen, wie ich eine bestimmte Anfrage an eine bestimmte App weiterleiten kann, damit sie getrennt bleiben und starten können, während sie eine gemeinsame Codebase von Bibliotheken teilen?

Oder, wenn jemand andere Vorschläge hat, wie man diese Apps kombinieren kann, bin ich ganz Ohr.

Sie sind beide Rails 2.3.10 Anwendungen JRuby 1.5.3 laufen, aber wir sind offen für möglicherweise zu Rails3 aktualisieren, wenn diese Dinge machen würde wesentlich einfacher oder Reiniger (dh mit einer besseren Rack-Integrations)

I Ich habe keine Rack-Programmierung gemacht, aber es tut mir nie weh, zu erfahren, ob das unser Leben leichter macht.

+0

-Rack wäre eine Deployment-Lösung sein und wahrscheinlich nicht die Lösung hier. – Chirantan

+0

Rack ist die Middleware richtig? Ich dachte, dass es die Anfrage abfangen und passend routen könnte? aber wieder weiß ich nicht viel darüber – brad

Antwort

1

Ihre Idee der Verwendung von Motoren ist, was ich vorschlagen würde.

Für das Routing würde ich es außerhalb von Rails behandeln.

Zum Beispiel würden Sie das folgende in nginx tun:

server { 
    # Match only one host.              
    listen 80 default; 
    server_name YOUR_SINGLE_APP_DOMAIN; 

    location/{ 
     upstream YOUR_SINGLE_APP_RAILS; 
    } 
} 


server { 
    # Fall thru and match any other host.              
    listen 80 default; 
    server_name ~^.*$; 

    location/{ 
     upstream YOUR_MULTI_DOMAIN_APP_RAILS; 
    } 
} 
+0

Können Sie den Upstream-Teil erklären? Ich habe das nie mit nginx benutzt. Außerdem verstehe ich, dass die Domain und das Proxying entsprechend angepasst werden, aber ich möchte, dass meine beiden Apps in einer App enthalten sind, also nehme ich an, dass meine Routen zwischen den beiden Rail-Engines einzigartig sein müssen. Ich habe gehofft, dass sie bestimmte Routen teilen können, aber auf der Grundlage der Domäne zu der richtigen Aktion weitergeleitet werden. – brad

+0

Ich glaube, ich ging die Nginx-Route b/c von dem, was Sie über Domains sagten, was ich außerhalb von Rails normalerweise behandeln würde. Soweit stromaufwärts, definieren Sie einfach einen Endpunkt (oder mehrere), der Anfragen bearbeitet. In nginx + passagier: "upstream my_rails_app {server 10.1.2.3:8000;} server {höre 10.1.2.3:8000 usw. usw." –

+0

das ist im Wesentlichen was wir getan haben – brad

2

Sie sollten vermeiden, Code auf Server-Ebene zu teilen, am besten zu tun wäre, Bibliotheken mit der gemeinsamen Code-Basis zu erstellen und sie während der Entwicklung zu verwenden. Das wahrscheinlich beste Shooting wäre die Verwendung von Helfern, da es am einfachsten ist, Module bereitzustellen, die Funktionalitäten für den gesamten Code bereitstellen.

In Bezug auf das Umschreiben von Funktionen in eine Anwendung, wählen Sie diese mit einem größeren Satz von Ready-Code als Basis. Es sollte möglich sein, den Code pro Methode zu migrieren, indem ein Webserver verwendet wird, der das Umschreiben von URLs unterstützt. Ich dachte Apache mit mod_rewrite zu verwenden. Der Plan wäre also:

  1. Richten Sie beide Anwendungen so ein, dass sie über einen Apache zugänglich sind.
  2. Wählen Sie eine Methode, die in beiden ähnlich ist, und überschreiben Sie sie in einer Anwendung, um die Anforderungen beider Anwendungen zu unterstützen.
  3. Fügen Sie in Apache eine Regel mod_rewrite hinzu, um den Datenverkehr nur für diese Anwendung an eine Anwendung umzuleiten.
  4. Gehen Sie zu Punkt zwei, bis alles neu geschrieben ist.
  5. alte Anwendung entfernen und Routing/mod_rewrite anpassen, um eine Anwendung

Sie haben nicht verwenden Apache zu verwenden, sollte es andere URL-Rewriting unterstützt Webserver sein.

Ich dachte daran, diesen Algorithmus zu verwenden, um unsere Anwendung auf Schienen 3.0 neu zu schreiben.

Verwandte Themen