2013-10-09 84 views
2

我有一個相當大的Grails應用程序,它有少量的控制器和視圖以及大量的服務。Grails:兩個站點,一個代碼庫

我現在需要構建一個擁有自己的視圖和控制器(控制器的工作方式有一些細微差異)的同一站點的「reskinned」版本,但同一組服務。一種選擇是通過定製的Grails插件將所有服務轉移到某種常見的地方,但我想知道是否有其他方法。

我想要做的是在控制器文件夾com.company.sitea和com.company.siteb中有兩個包,其中有一個環境變量可以有效地選擇使用哪一個。同樣,兩個不同的視圖集,每個視圖都基於此環境變量進行選擇,但具有共享taglib。

我無法找到任何明顯的做到這一點,是否有插件或標準的做法(或類似的)?這個想法是,我有一個代碼庫,我會構建一場戰爭,但戰爭將部署在兩個不同的地方,並且每一個都會爲特殊的環境變量指定一個值。

+2

老實說,我會去插件路線自己。甚至將服務拉出到他們自己的Grails應用程序(WAR)中,並讓控制器作爲web服務與他們交談。 – Gregg

+0

是的,如果我們不能將它們放在一起,這就是我們要做的事情,但根據我的經驗,分割代碼庫半無用地阻礙了重構,並導致我厭惡的鎖步變更的噩夢。這兩個網站將共享大約98%的功能(不包括視圖細節),將一個代碼庫轉換爲三個代碼庫將是一個恥辱。 – Rod

+0

我也爲「普通」插件路線投票。因爲您已經在製作插件 – Vinny

回答

3

我們已經成功地使用我們將第一個應用程序作爲插件的模式。它將作爲第一個用例的應用程序運行,並作爲第二個用例的插件提供。

如果你這樣做(一個grails應用程序是一個應用程序和插件在同一時間),你必須排除插件作爲應用程序運行時啓動。否則,應用程序將自我啓動兩次:作爲應用程序和插件。 「grails.plugin.excludes」配置設置(這裏解釋)可以防止發生這種情況。

我已經在這個JIRA問題記錄這個特殊用例: http://jira.grails.org/browse/GRAILS-6751 「允許Grails應用程序將被用作一個Grails插件,除了使用它作爲一個應用程序」

這竟然是一個殺手在許多情況下爲我們的功能。我們已經能夠在其他用例中重用應用程序作爲插件,並將幾個單獨的應用程序組合成一個具有此功能的應用程序。當然有一些限制(如名稱衝突),但這對我們來說並不是問題。

最常見的用例是重用一個完整的應用程序,並在另一個應用程序中重寫視圖。由於現有的應用程序可以同時作爲應用程序和插件,因此在將「公用部分」提取到單獨的插件中沒有額外的工作。

要使現有的Grails應用程序成爲插件,您只需將MyAppNameGrailsPlugin.groovy文件添加到根目錄並將此配置值添加到grails-app/conf/Config。常規: grails.plugin.excludes = [ 'myAppName'(駱駝情況下應用程序的名稱開頭小寫字母)

郵件列表討論: http://grails.1312388.n4.nabble.com/Dynamic-applications-extending-an-existing-application-with-Grails-tp4634094p4634202.html

伯特的詳細的博客文章: http://burtbeckwith.com/blog/?p=1973

大衛道森的介紹: http://skillsmatter.com/podcast/home/large-scale-grails-using-plugins-how-to-modularise-an-application/jd-8012

0

一個重要的因素是這兩個版本是否應該對相同的數據進行操作?所以它們會在同一個數據庫上有不同的前端?或者他們將完全分開,例如按客戶部署?

如果第一個,我會去web服務的方式,使一個應用程序將包含業務邏輯和控制器工作作爲web服務,以及其他的應用程序將只是有不同的控制器,「會說話」的第一個

你可以也是在一個項目(兩個版本)相結合的一切,並限制使用Apache卸除

如果後者訪問來自不同的領域不同的控制器,我也想嘗試共同部分提取到一個插件

+0

這些版本都不能連接到任何數據庫,它們通過Web服務完成所有工作(這就是爲什麼它們共享如此多的服務類) – Rod

相關問題