2013-10-09 43 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

相关问题