2

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

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

我想做的是在控制器文件夹中有两个包,com.company.sitea 和 com.company.siteb,并带有一个环境变量,可以有效地选择使用其中的一个。类似地,两组不同的视图,每一个都是根据这个环境变量选择的,但是有一个共享的 taglib。

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

4

2 回答 2

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

于 2013-10-11T03:12:06.717 回答
0

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

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

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

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

于 2013-10-09T21:00:46.133 回答