我正在使用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'
}
是否可以实现与当前数据库迁移插件类似的东西?
感谢任何帮助/想法。
答案 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)
我的解决方案是为不同环境之间的常见脚本定义不同的文件夹,例如dev
,test
,live
和common
。
目录结构如下:
P.S。 changelog_ENVIRONMENT
位于migrations
我的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)
我一直在研究同样的事情(发现这篇文章)。最后我只能提出几个选项,不包括你的(可能比我自己的想法更好):