Grails:两个站点,一个代码库

时间:2013-10-09 19:47:53

标签: grails

我有一个相当大的Grails应用程序,它有一些控制器和视图,以及大量的服务。

我现在需要构建同一站点的“reskinned”版本,该版本具有自己的一组视图和控制器(控制器的工作方式有一些细微差别),但是完全相同的服务集。一种选择是通过自定义Grails插件将所有服务移动到某种常见位置,但我想知道是否还有其他方法。

我想要做的是在controllers文件夹com.company.sitea和com.company.siteb中有两个包,其中一个环境变量可以有效地选择使用哪一个。类似地,有两组不同的视图,每组都基于此环境变量选择,但具有共享的taglib。

我无法找到任何显而易见的事情,是否有插件或标准方法(或类似的东西)?我的想法是,我有一个代码库,我将构建一个战争,但战争将部署在两个不同的地方,每个地方都会为特殊的环境变量指定一个值。

2 个答案:

答案 0 :(得分:3)

我们已成功使用模式,我们将第一个应用程序设为插件。它将作为第一个用例的应用程序运行,并作为插件包含在第二个用例中。

如果你这样做(grails应用程序同时是一个应用程序和插件),你必须排除插件作为一个应用程序运行时启动。否则,应用程序将自动启动两次:作为应用程序和插件。 “grails.plugin.excludes”配置设置(此处说明)可防止这种情况发生。

我在此jira问题中记录了这个特殊用例: http://jira.grails.org/browse/GRAILS-6751 “除了将Grails应用程序用作应用程序之外,还允许将Grails应用程序用作Grails插件”

在许多情况下,这已成为我们的杀手锏。我们已经能够将应用程序重用为其他用例中的插件,并将多个单独的应用程序组合到具有此功能的应用程序中。当然有一些限制(比如姓名冲突),但对我们来说这不是问题。

最常见的用例是重用完整的应用程序,只是覆盖另一个应用程序中的视图。由于现有的应用程序可以同时是一个应用程序和插件,因此在将“常用部分”提取到单独的插件时没有额外的工作。

要将现有Grails应用程序设为插件,您只需将MyAppNameGrailsPlugin.groovy文件添加到根目录,并将此配置值添加到grails-app / conf / Config.groovy: grails.plugin.excludes = ['myAppName'](以小写字母开头的驼峰式应用程序名称)

邮件列表讨论: http://grails.1312388.n4.nabble.com/Dynamic-applications-extending-an-existing-application-with-Grails-tp4634094p4634202.html

Burt的详细博文: http://burtbeckwith.com/blog/?p=1973

David Dawson的演讲: http://skillsmatter.com/podcast/home/large-scale-grails-using-plugins-how-to-modularise-an-application/jd-8012

答案 1 :(得分:0)

一个重要因素是这两个版本是否应该在相同的数据上运行?所以他们将在同一个数据库中使用不同的前端?或者它们将完全分开,例如按客户部署?

如果第一个,我会去webservices方式,所以一个应用程序将包含业务逻辑,控制器作为webservices工作,而其他应用程序将只有不同的控制器,“与第一个”谈话

您还可以将一个项目(两个版本)中的所有内容组合在一起,并通过apache卸载限制对来自不同域的不同控制器的访问

如果是后者,我也会尝试将常用部分提取到插件中