在应用程序的更改日志中包含Grails插件迁移

sol*_*ola 5 grails database-migration

我正在使用Grails 2.x开发模块化应用程序,我希望以每个插件/模块在其grails-app/migrations文件夹中托管自己的迁移的方式组织数据库迁移.(而不是将所有迁移放入组合应用程序项目的迁移文件夹中)

组合应用程序项目本身通常没有任何迁移,因为它们存储在插件中.

是否可以在应用程序项目中构建"主"更改日志,并且只按正确的顺序引用插件迁移文件?这样我就可以拥有一个非常干净的迁移系统来处理插件依赖性问题(我将插件迁移文件引用按顺序放置,这些顺序可能会随着时间的推移而变化,因此迁移的顺序可能相当复杂).

默认情况下,Database Migrations插件似乎根本不检查/执行插件迁移(在我的情况下是内联插件).文档没有说明这种情况,他们专注于简单的非模块化开发工作流程.

我已经看到了DB Migrations插件的一个已解决的问题,它以某种方式允许在应用程序的迁移目录之外运行迁移文件,但我认为这将使用某种硬编码的相对/绝对路径,这不是很优雅.

最优雅的解决方案是,如果我还可以为每个迁移"include"语句指定插件,那么我的主更改日志将如下所示.

databaseChangeLog = {
  include plugin:'core'       ,file:'000-initial.groovy'
  include plugin:'accounting' ,file:'000-initial.groovy'
  include plugin:'core'       ,file:'001-drop-constr-XXX.groovy'
  include plugin:'accounting' ,file:'001-add-col-yyy-to-posting-table.groovy'
}
Run Code Online (Sandbox Code Playgroud)

是否可以实现与当前数据库迁移插件类似的东西?

任何帮助/想法表示赞赏.

sol*_*ola 3

我已经制定了以下解决方案,直到 Grails Migrations 插件更好地支持模块化项目:

在开发过程中,与插件相关的迁移保留/开发在插件的“迁移”文件夹中,并按问题中的名称命名(例如:000-initial.groovy)。

每个迁移都包含一个与插件相关的包定义:

package core
Run Code Online (Sandbox Code Playgroud)

迁移文件应根据包定义放置在“migrations”文件夹内的子文件夹中。

可以创建特定于插件的更改日志来测试插件内的最新迁移。在这种情况下,插件应该正确定义一个数据库连接,理想情况下,这应该指向为插件测试保留的数据库模式。当然,插件的数据库设置可以指向应用程序本身的开发模式

我们将在核心插件的“migrations”文件夹中包含以下文件:

changelog.groovy
core/000-initial.groovy
core/001-drop-constr-XXX.groovy
Run Code Online (Sandbox Code Playgroud)

当我们需要在应用程序环境中测试迁移(但在发布阶段最新)时,我们将所有测试的迁移复制到应用程序项目的“migrations”文件夹中,这样我们将得到如下内容:

core/000-initial.groovy
core/001-drop-constr-XXX.groovy
accounting/000-initial.groovy
accounting/001-add-col-yyy-to-posting-table.groovy
Run Code Online (Sandbox Code Playgroud)

我们将迁移包含在应用程序的主变更日志中,如下所示(满足插件依赖性):

databaseChangeLog = {    
  include file: 'core/000-initial.groovy'
  include file: 'accounting/000-initial.groovy'
  include file: 'core/001-drop-constr-XXX.groovy'
  include file: 'accounting/001-add-col-yyy-to-posting-table.groovy'
}
Run Code Online (Sandbox Code Playgroud)

复制文件后,我们可以在应用程序的开发数据库架构上测试迁移。

如果需要对复制的迁移进行更改,我们需要确保将更改同步回插件迁移文件夹中的原始迁移文件(因为其他应用程序可能会使用这些插件迁移)。