5

更新:从 Grails 1.3.6 开始,可以从 Gant 脚本访问整个域。来自 Grails 1.3.6 发行说明

您现在可以使用 run-script 命令从命令行运行一个或多个 Groovy 脚本,例如

grails run-script [path-to-script-1] [path-to-script-2]...[path-to-script-n]

这解决了 Gant 脚本中的问题,您无法方便地访问应用程序类,因为当脚本启动时它们在类路径中不可用。


大家好,

我是使用 Grails 的新手(在实际项目中),我需要执行一个一次性脚本,该脚本读取一个文件,然后填充我的数据库。

我希望脚本在我的 grails 应用程序的上下文中运行,所以我使用了 create-script 命令。我现在明白这使它成为一个“甘特”脚本。这样做的原因是我认为它可以让我轻松访问所有 grails 领域的优点,这样我就可以轻松地做这样的事情:

Car car = new Car(model: 'bar', brand: 'Ford')
car.save()

在这里,Car 是我的域类之一,我从文件中检索到了字符串“bar”和“Ford”。

我的脚本的开头如下所示:

import com.foo.Car    
grailsHome = Ant.project.properties."environment.GRAILS_HOME"
includeTargets << new File ( "${grailsHome}/scripts/Bootstrap.groovy" )
target(main: "a script for storing cars") {
    depends(bootstrap, classpath) // code dealing with the file with cars follows

令人惊讶的是,groovy 给了我一个java.lang.NoClassDefFoundError: com.foo.Car令人惊讶的是,当我使用命令执行脚本时grails LoadCars

我采取了错误的方法,还是我做错了什么更简单的事情?

任何帮助表示赞赏

4

4 回答 4

6

我知道这些脚本很有用,我可能会因为建议它而收到讨厌的邮件,但我过去只是将这类东西直接合并到我的应用程序中。

我在我的配置中设置了一个标志,指示是否应该引导数据,如果是,引导代码在启动时查找逗号分隔的文件并调用服务方法来加载数据。

于 2010-12-03T19:09:36.637 回答
2

我已经更新了grails run-script Gant 脚本(上面提到的 Jared)以使用 grails 1.3.5。我一直打算这样做一段时间,但这个问题促使我最终解决了它)。

只需下载帖子中描述的脚本,将其保存在您的 grails“脚本”目录中,然后您就可以运行自己的 groovy 脚本来引导数据:

grails run-script script-path/boostrapMyDataIntoApp.groovy
于 2010-12-04T04:48:10.917 回答
1

我必须这样做,并且您必须创建一个特殊的脚本以允许您从标准 grails 脚本访问 GORM。有关更多信息,请参阅此问题。我不确定脚本在 grails 1.3 下的当前状态,但脚本的作者在评论中发布。

于 2010-12-03T18:57:16.253 回答
1

汉斯,这里有几个选择,假设你不打算打磨 GANT 脚本 8^)

所以假设你正在做一些集成模式的 TDD,对吗?您是否查看过 db-stuff 插件?实际上,它利用了名为 dbUnit 的开源包(JUnit 项目的扩展),对于 Java 和 Groovy 项目来说,这也是一个出色的选择。

* db-stuff <0.3.0> -- 数据库模式管理和数据导入/导出。生成通用模式文件并将基础/种子/测试数据导入或导出到您的数据库中。


根据环境的不同,我传统上也在 BootStrap 中执行此操作 - 我尽量不要让这些域假设/约束过于不同步。与我的架构。

这是我正在谈论的佳能:

class BootStrap {

    def init = { servletContext ->
        if (GrailsUtil.environment.equals( GrailsApplication.ENV_DEVELOPMENT )) {
            log.info( "Loading sample data for 2010 models..." );            

            new Car( manufacturer: new Manufacturer( name: "Toyota" ), model: "Prius" )
            new Car( manufacturer: new Manufacturer( name: "GM" ), model: "Volt" )
//...
于 2010-12-04T19:29:59.093 回答