2011-01-15 12 views
9

Oto nasze podstawowe wymagania:Uruchom dostosowaną wersję aplikacji Rails

  • Mamy aplikacji bazy szyny, która jest aktywnie utrzymane.
  • Chcemy zaoferować niestandardową wersję tej aplikacji, ponieważ:
    • serwery muszą znajdować się w siedzibie klienta i działać w innej domenie.
    • Istnieje specjalna oprzyrządowanie do rejestrowania dla własnego monitorowania w centrum danych.

Aby to zrobić, widzę kilka opcji, aby osiągnąć ten cel:

  • git branch
  • Rails::Engine
  • Rails::Application

Najbardziej oczywista odpowiedź byłaby być oddziałem Git, dla pełnej elastyczności.

Nie jestem jednak pewien, czy to dobry pomysł, ponieważ baza kodów jest w dużej mierze udostępniona, a linia główna ma o wiele więcej zajęć - nadrobienie zaległości i scalenie może być tylko dodatkowym kłopotem.

Chcemy rozdzielić oryginalne i spersonalizowane wersje tak daleko, jak to możliwe. Innymi słowy, chcemy możliwie najmniej konfliktów między oryginałem a spersonalizowanym.

Rails::Engine lub Rails::Application wydawał się bliski idei (nie jestem zaznajomiony z szynami Engines), ale nie rozumiem, jak mają OurApp::Application i OurCustomizedApp::Application w jednym miejscu i przełączać się między nimi w skali globalnej i dynamicznie.

Prawdopodobnie byłoby miło mieć:

  • niestandardowe inicjalizatory, kontrolery i widoki w oddzielnym katalogu, aby zastąpić (lub plaster) oryginalną
  • możliwość określenia, która aplikacja (oryginał lub dostosować), aby uruchomić przez zmienną środowiskową jak RAILS_APP
  • oddzielnych plikach konfiguracyjnych, tak: config/database.yml być config/customer1/database.yml
  • możliwość korzystania z tego samego deploy.rb dla Kapistrana (p robably z config/servers.yml i config/customer1/servers.yml zdefiniowanie ról i IPS?)

Czy praktyki/zjazdy do naszych potrzeb? Jakakolwiek rada?

Nasze aplikacje działają w Ruby 1.9.2 + Rails 3.0.3.

UPDATE

Zaczęliśmy go jako gałąź Git. Stworzyliśmy zadanie rake do wygenerowania pliku pod numerem config/branch, który zawiera tekst taki jak "master" lub "customized", a application.rb odczytuje go podczas bootstrap.Konwersje takie jak database.yml lub są teraz dostępne w postaci config/mainline/ lub config/customized/, a application.rb odpowiednio je obsługuje.

config.paths.config.database = "config/#{branch}/database.yml" 

Nie doskonały, ale wystarczająco dobry na razie. Zaktualizuję, gdy znajdziemy lepszy sposób na zrobienie tego.

Odpowiedz

1

Wiem, że nie jest to dokładna odpowiedź, której szukasz, ale wierzę, że Git będzie najmniejszym nakładem pracy - i najłatwiejszym w zarządzaniu, długoterminowym - nad dostosowaniem aplikacji i dodaniem logiki do obsługi dodatkowe pliki konfiguracyjne, modyfikowanie plików wdrażania oraz zarządzanie (potencjalnie) nowymi plikami css/js/template.

Korzystanie z rebase & Połączenie będzie mniej podatne na błędy, a tak długo, jak utrzymujesz swoje gałęzie synchronizowane regularnie, nie powinieneś mieć żadnych poważnych problemów z utrzymaniem ich obu na czasie. W końcu to właśnie Git jest dobry! ;)

+0

Zakończyliśmy działalność oddziału Git i do tej pory działało całkiem dobrze. Dzięki! – kenn

0

Używamy Git, aby to zrobić dość często.

2

Myślę, że najlepszym sposobem jest zrobienie tego w staroświecki sposób.

Najpierw dodaj do swojego projektu klasę singleton (w /lib) o nazwie podobnej do Affiliate. Ta klasa powinna zapewniać domyślne implementacje (niezależnie od tego, jakiej aplikacji bazy chcesz użyć) dla dowolnych części aplikacji, które można dostosować. W tym momencie twoja aplikacja działa tak samo, ale ma haki, aby umożliwić dostosowanie.

Na miejscu Twojego klienta, wdrażanie tego samego kodu źródłowego (dostarczana jako gem, być może?), Ale również wdrożyć plugin Rails, który zastępuje Affiliate więc jego Singleton instance metoda zwraca niestandardową podklasę, która dostarcza informacji o klientach lub specyficzne zachowania .

Edited by dodać: Ryzyko z tego podejścia jest to, że deweloperzy inadvertantly złamać rzeczy, ponieważ oni testować tylko ich zmian wobec domyślnej partner. Powinieneś użyć automatycznego testowania i ciągłej integracji, aby to złapać.

+0

Nasza adaptacja jest stosunkowo niewielka, ale wystarczająco duża, aby nie mieściła się w jednej klasie, i gdzie pozwolić na dostosowanie jest nieprzewidywalna z punktu widzenia głównego punktu widzenia. Dostosowanie wymaga dużej mocy, na przykład inicjalizatorów niestandardowych itp. – kenn

1

Wygląda na to, że masz tutaj dwa interesujące wymagania. Pytasz, jak mieć dwie osobne aplikacje i przełączać się między nimi dynamicznie. Zakładam, że chcesz kohortować różne "wersje" tej samej aplikacji i zmienić ustawienia aplikacji na różne dostosowania w zależności od domeny. Jednak to bardzo różni się od używania gałęzi Git do wdrażania dwóch różnych aplikacji.

Czy możesz tutaj wyjaśnić swoje wymagania?

Nie polecam tutaj oddziałów Git. Polecam używanie silników. Szczególnie łączenie silnika w klejnot.

Dołącz klejnot do projektu niestandardowego, a następnie użyj tradycyjnych sposobów nadpisywania funkcji w silniku. Możesz także użyć tradycyjnych metod rozszerzania istniejącego kodu Ruby, aby zastąpić funkcjonalność w twoim klejnocie.

W ten sposób zachowujesz wszystkie różnice określone w oddzielnym projekcie. Ten osobny projekt będzie również posiadał własny zestaw testów, itp.

+0

, podczas gdy myślę, że ogólnie rzecz biorąc dobrym pomysłem jest posiadanie silnika do obsługi wielu aplikacji, nie jestem pewien, czy utrzymywać go jako klejnot - nasza aktywność w głównej aplikacji jest dość intensywna, a tworzenie klejnotów dla każdego zatwierdzenia nie Nie bądź realistą. Wygląda na to, że aplikacja internetowa jest wdrażana z gem, a nie z repozytorium git. Zrobiłbym to na odwrót - aplikacja do głównej linii i silnik/plugin do niestandardowego, ale nie wydaje się również dobrym rozwiązaniem. – kenn

Powiązane problemy