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

时间:2013-12-20 22:58:14

标签: grails database-migration

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

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

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

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

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

最优雅的解决方案是,如果我还可以为每个迁移“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'
}

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

感谢任何帮助/想法。

3 个答案:

答案 0 :(得分:3)

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

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

每次迁移都包含一个包定义,它将它与插件相关联:

package core

根据包的定义,应将迁移文件放入“migrations”文件夹中的子文件夹中。

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

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

changelog.groovy
core/000-initial.groovy
core/001-drop-constr-XXX.groovy

当我们需要在应用程序环境中测试迁移时(但是在发布阶段的最新版本),我们将所有经过测试的迁移复制到应用程序项目的“迁移”文件夹中,这样我们就会得到这样的结果:

core/000-initial.groovy
core/001-drop-constr-XXX.groovy
accounting/000-initial.groovy
accounting/001-add-col-yyy-to-posting-table.groovy

我们在应用程序的主更新日志中包含迁移,它们看起来像这样(满足插件依赖性):

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'
}

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

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

答案 1 :(得分:1)

我的解决方案是为不同环境之间的常见脚本定义不同的文件夹,例如devtestlivecommon

目录结构如下:

P.S。 changelog_ENVIRONMENT位于migrations

之下

Directory Structure

我的Config.groovy看起来像:

/**
* Database Migration Config
*/
//Enable database migration to run automatically
grails.plugin.databasemigration.updateOnStart = true

environments {
    development {
            grails.plugin.databasemigration.updateOnStartFileNames = ['changelog_dev.groovy']
    }
    test {
            grails.plugin.databasemigration.updateOnStartFileNames = ['changelog_test.groovy']
    }
    production {
        grails.plugin.databasemigration.updateOnStartFileNames = ['changelog_live.groovy']
    }
}

然后,更改日志_ environment可以引用任何文件夹。 注意:使用只包含一个单词的包名称,因为java样式包名称(com.example.class)对我不起作用。

<强>样品
migrations/common/001-common-script.groovy

package common

databaseChangeLog = {

    changeSet(author: "author", id: "some-id") {

    }
}

migrations/dev/001-dev-script.groovy

package dev

databaseChangeLog = {

    changeSet(author: "author", id: "some-other-id") {

    }
}

migrations/changelog_dev.groovy

import dev.*
import common.*

databaseChangeLog = {

    include file: 'common/001-common-script.groovy'
    include file: 'dev/001-dev-script.groovy'
}

答案 2 :(得分:0)

我一直在研究同样的事情(发现这篇文章)。最后我只能提出几个选项,不包括你的(可能比我自己的想法更好):

  1. 创建数据库迁移插件的分支并将其更改为首先在文件夹结构中搜索更改日志,然后在其他资源中搜索。
  2. 创建在安装插件(项目/应用程序)时触发的脚本,该脚本将更改日志复制到应用程序更改日志路径(通常是迁移)。
  3. 将groovy逻辑添加到changelog中,包括该查找并返回插件文件夹。