2009-11-20 68 views
21

我有一個客戶想要將他們的Rails應用程序在一個小衆市場中取得成功,並將其應用到另一個類似的小衆市場。這個應用程序的新實例將開始非常相似:所有相同的功能,不同的標誌和顏色。但是,如果新網站成功,則不可避免地需要重大的自定義設置,而不應將其應用於原始網站。同時,如果錯誤得到修復並且對一個應用程序進行了改進,那麼這兩個應用程序應該能夠共享這些改進。從同一個rails代碼庫運行多個站點?

任何人都可以提出解決此問題的策略或資源嗎?如何保留適用於這兩個應用程序的更改花費更長時間來測試和實施?

是的,我知道答案涉及SCM,插件,寶石和Rails引擎。這些工具將被使用。但我想知道如何使用這些工具來解決這個問題。

鏈接也歡迎。


這個問題是不一樣的:

Multiple websites running on same codebase? 在我的問題,我沒有運行使用不同的設置完全一樣的應用程序。

How do you sync changes between multiple codebases?我在問一個類似的問題,但我特別詢問了關於Rails應用程序。

回答

29

我們目前使用的設置與您所描述的設置非常相似。

我們開始爲客戶開發一個有點大的Rails應用程序(銷售,庫存管理,產品目錄等)。完成之後,出現了幾個新功能幾乎相同的新請求。

但是,原始的應用程序必須保持不變,添加新的功能,糾正錯誤和什麼。

擴展的需要維護大多數功能,但改變外觀和外觀。

我們所做的事情都是按照一系列的步驟:

  1. 首先我們開始清理代碼,拉硬編碼引用表,減少和優化查詢,查找丟失的索引和方法來改善我們的ActiveRecord使用
  2. 稍微滿意之後,我們開始開發缺少的測試。我不能強調它爲什麼很有用,因爲我們將爲多個應用程序維護相同的代碼庫,並且需要核心功能受到來自新變更的保護。
  3. 這也是魔術字:核心功能。我們開始選擇可重用的基本功能,並提取所有通用代碼。這給了我們混合的控制器,模型和視圖,我們開始變成模塊,插件和寶石。 什麼地方?取決於你的代碼。作爲一個經驗法則,不涉及領域語言的功能去插件(或者如果它不依賴於Rails太多的話就是寶石)
    1. 這種方法使我們幾個插件,然後我們一起重新組合原始項目的寶石,然後找到它自己的GIT存儲庫。這樣,我們有一個主要的「模板」存儲庫,它將所有組件和其他幾個GIT存儲庫粘在一起。
    2. 最後,我們開發了一個簡單的主題系統(基本上加載/ stylesheets/themes /:theme_name /並從DB獲取theme_name)。由於它是一個Intranet項目,我們幾乎可以通過適當的CSS樣式做任何事情。我猜想與IE工作,你需要一個更復雜的方法。
    3. 然後,我們只是使用主存儲庫在其上開發新功能。

現在,我們如何應對變化的核心基地。我們從我們的模板庫開始。我們修復或定義應該修復或更改的位置,並在其中更改它或者在其上對應的gem/plugin。正確測試後,我們將其部署到我們的GitHub帳戶。

最後,我們合併/重新綁定來自該模板存儲庫的其他項目,以獲取新更新。

聽起來有些複雜,但它只是爲了設置。目前的工作流程非常簡單和容易,具有與幾個開發人員一起工作而沒有更大問題的特定優勢。

+0

哇。謝謝。這非常有用,並且有清楚的解釋。 – nicholaides 2009-11-21 06:47:20

+0

沒問題,很高興能夠提供幫助。項目管理有時候有點困難,有些訂單總是有助於:) – Yaraher 2009-11-24 14:16:50

+0

有沒有進一步的閱讀,你可以推薦這種方法? – danieldekay 2014-04-08 12:57:34

1

我們在我公司做類似的事情。除目前涉及多個環境(生產,測試,開發)外。我們使用SVN作爲我們的SCM來保持我們的代碼直線化,並讓我們複製當前的穩定環境並創建應用程序的單獨版本(並且可能會更改徽標或某些功能等)。我強烈建議使用Apache/Nginx和Phusion's Passenger運行環境。這使我們可以在相同/相似的代碼庫上單獨運行所有這些應用程序。就是這樣。我們需要數據庫,一個生產和一個開發來保持我們的實時數據分離,但您可以輕鬆地將兩個應用程序實例以這種方式連接到相同的數據庫。對於我們來說,它能夠開發,測試和部署多個Web應用程序,而無需關閉主生產服務器,這對我們來說非常有效。

+0

,如果你想了解如何配置一些作品的詳細信息是可能的,我很樂意提供一些我們的配置文件,尤其是對乘客,因爲這是一個最難解決的難題之一首先得到解決。 – Lukas 2009-11-20 18:43:30

2

對主站點的觸摸很少,在擴展模板和更改樣式時可能會使用Ruby代碼。我已經對廣泛的Django工作和佈局可以看起來像:

project/ 
    sites/ 
     site_one/ 
      templates/ 
      models.py 
      settings.py 
      urls.py 
      views.py 
     site_two/ 
      templates/ 
      models.py 
      settings.py 
      urls.py 
      views.py 
    base_app/ 
    settings.py 

你可以嘗試做同樣的事情在Rails的:

main_webapp/ 
    app/ 
    config/ 
    ... 
    sites/ 
     site_one/ 
      controllers/ 
      models/ 
      views/ 
     site_two/ 
      controllers/ 
      models/ 
      views/ 

假設的功能是跨站點相同的,但他們只是有不同佈局和樣式,將沒有或很少的模型和控制器代碼。如果您希望爲特定網站添加更多功能,只需將代碼粘貼到所需的站點文件夾下。

Django也有概念Sitesability在一個特定的項目文件夾和應用程序文件夾中尋找模板。您可以嘗試複製這些功能並將它們轉移到Rails以實現從一個代碼庫運行多個站點。

我認識到你正在尋找一個Rails解決方案,但你仍然可以檢查它是如何在Django中完成的,並將一些有用的功能複製到另一端。如果我喜歡Rails的特定功能,我將把它移植到Django/Python。

+0

通過設置特定於站點的路徑,這在Rails中很容易實現。例如對於視圖''config.paths ['app/views']。unshift(「app/views /#{config.site_name}」)''但是幾乎所有東西都可以這樣做。這是Rails 4,但以前的版本也有。甚至可以使用''prepend_view_path''在控制器中執行此操作 – 2013-12-21 20:57:00

相關問題