2010-11-18 38 views
8

Notre société a commencé avec un seul produit, une application rails soutenue par certains services Java, puis a décidé qu'ils voulaient un autre produit qui était initialement considérablement différent du premier, mais le temps a passé nous avons réalisé qu'ils commençaient à converger, et faire un changement de code à un nécessite un changement de code similaire à l'autre pour une nouvelle fonctionnalité/correction de bogue. Cela devient évidemment une douleur.Combinaison de 2 applications de rails à une seule base de code

Dans certains cas, nous avons des pierres précieuses qui partagent certaines de ces fonctionnalités, mais il va au-delà de rubis en javascript, css etc ..

Je suis chargé de la fusion de ces deux applications en une seule base de code. Je pense finalement que nous aimerions que ce soit une seule application avec un accès basé sur les permissions, mais cela viendra beaucoup plus tard.

Ma première pensée pour les mettre rapidement ensemble est de créer deux moteurs de rails et de partager des bibliothèques communes entre eux. Je pense que c'est le moyen le plus rapide de combiner le code, de trouver des sections communes et de commencer à partager.

Mon premier problème est de savoir comment passer d'une application à l'autre. Une application utilise un seul nom de domaine qui ne change jamais, l'autre application a de nombreux domaines. Quelqu'un peut-il suggérer comment je pourrais acheminer une demande particulière à une application particulière afin qu'ils puissent rester séparés pour commencer tout en partageant une base de code commune de bibliothèques?

Ou, si quelqu'un a d'autres suggestions quant à un moyen de combiner ces applications, je suis tout ouïe.

Ils sont tous les deux Rails 2.3.10 applications en cours d'exécution JRuby 1.5.3, mais nous sommes ouverts à peut-être mise à niveau Rails3 si cela rendrait les choses beaucoup plus facile ou plus propre (ie avec une meilleure intégration en rack)

I N'a pas fait de programmation Rack mais n'a jamais fait de mal d'apprendre si cela nous facilitera la vie.

+0

rack serait une solution de déploiement et est probablement pas la solution ici. – Chirantan

+0

rack est le middleware à droite? Je pensais qu'il pourrait intercepter la demande et l'itinéraire de manière appropriée? mais encore une fois je ne sais pas beaucoup à ce sujet – brad

Répondre

1

Votre idée d'utiliser des moteurs est ce que je suggère.

Pour le routage, je le manipulerais en dehors de Rails.

Par exemple, vous procédez comme suit dans nginx:

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

Pouvez-vous expliquer la partie en amont? Je n'ai jamais utilisé ça avec nginx. En outre, je comprends que le domaine et le proxy sont appropriés, mais je veux que mes deux applications soient contenues dans une application one rails, donc selon ce que je suppose, mes routes entre les moteurs à deux rails doivent être uniques? J'espérais qu'ils pourraient partager certaines routes, mais seraient dirigés vers l'action correcte basée sur le domaine. – brad

+0

Je suppose que je suis allé la route nginx b/c de ce que vous disiez sur les domaines, ce qui est quelque chose que je voudrais gérer en dehors de Rails habituellement. En amont, vous définissez simplement un point de terminaison (ou plus d'un) qui gère les requêtes. En nginx + passager: "en amont my_rails_app {serveur 10.1.2.3:8000;} serveur {écouter 10.1.2.3:8000 etc. etc." –

+0

c'est essentiellement ce que nous avons fini par faire – brad

2

Vous devriez éviter de partager du code au niveau du serveur, le mieux serait de créer des bibliothèques incluant une base de code commune et de les utiliser pendant le développement. Probablement le meilleur shoot utiliserait des aides car c'est le moyen le plus simple de fournir des modules qui fournissent des fonctionnalités partout dans votre code.

En ce qui concerne les fonctionnalités de réécriture à une application, choisissez celle avec un plus grand ensemble de code prêt comme base. Il devrait être possible de migrer le code par méthode en utilisant un serveur Web prenant en charge la réécriture d'url. J'ai pensé à utiliser Apache avec mod_rewrite. Donc le plan serait:

  1. Configurer les deux applications pour qu'elles soient accessibles par un seul apache.
  2. Choisissez une méthode similaire dans les deux et réécrivez-la dans une application pour prendre en charge les deux exigences des applications.
  3. Dans apache, ajoutez une règle mod_rewrite pour rediriger le trafic vers une application uniquement sur cette action.
  4. Allez au point deux jusqu'à ce que tout soit réécrit.
  5. Retirez ancienne application et régler le routage/mod_rewrite d'utiliser l'une application

Vous ne devez pas utiliser apache, il devrait y avoir d'autres serveurs Web supportant url rewriting.

Je pensais utiliser cet algorithme pour réécrire notre application aux rails 3.0.