2010-12-03 61 views
5

更新:從Grails 1.3.6開始,可以從Gant腳本訪問完整域。 來自Grails 1.3.6 release notes用於填充數據庫的一次性grails腳本

您現在可以使用run-script命令從命令行運行一個或多個Groovy腳本,例如,

的Grails運行腳本[路徑到腳本-1] [路徑到腳本2] ... [路徑到腳本-N]

它解決的問題Gant腳本在那裏你不能方便地訪問應用程序類,因爲它們在腳本啓動時在類路徑中不可用。


大家好,

我是新來使用Grails(在一個真正的項目),我有一個一次性的腳本,我需要執行,讀取文件,然後填充我的數據庫。

我希望腳本能夠在我的grails應用程序的上下文中運行,所以我使用了create-script命令。我現在明白這是一個'Gant'腳本。在這樣做的理由是,我認爲這將讓我輕鬆訪問所有的Grails領域良好的煩躁,這樣我就可以做這樣的事情很容易:

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

這裏,租車是一個我的域名類和字符串'酒吧'和'福特'我從我的文件中檢索。

我的劇本的開始是這樣的:

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 

出人意料的是,常規給我java.lang.NoClassDefFoundError: com.foo.Car,當我用命令grails LoadCars

我是否採取錯誤的做法執行腳本,或者是有更簡單的事情我做錯了?

任何幫助表示讚賞

回答

2

我已經更新了grails run-script Gant script(以上由Jared引用)與grails 1.3.5一起工作。我有一段時間的意思,但這個問題促使我終於接近它)。

只需下載在帖子中描述的腳本,它保存在你的Grails「腳本」目錄下,然後你可以運行自己的Groovy腳本來引導數據:

grails run-script script-path/boostrapMyDataIntoApp.groovy 
+0

感謝了一堆泰德! – 2010-12-04 14:02:19

1

我已經做到這一點,你必須創建一個特殊的腳本,讓你從一個標準的Grails腳本訪問GORM。有關更多信息,請參閱this question。我不確定該腳本的當前狀態是在grails 1.3下發布的,但腳本的作者在評論中發佈了。

6

我知道這些腳本很有用,而且我可能會因爲建議而收到仇恨郵件,但我過去只是將這些東西直接加入到我的應用程序中。

我在我的配置中設置了一個標誌,指示是否應該引導數據,如果是,引導程序代碼將在啓動時查找逗號分隔文件並調用服務方法來加載數據。

1

漢斯,這裏還有幾種選擇,假設你不打算擦亮GANT scripting chops 8 ^)

因此,假設你正在做一些集成模式的TDD,是否正確? 你看過db-stuff插件嗎?實際上,它利用了稱爲dbUnit的開源軟件包(JUnit項目的擴展),對於Java和Groovy項目來說,這也是一個不錯的選擇。

* db-stuff < 0.3.0> - db模式管理和數據導入/導出。生成通用模式文件並將基礎/種子/測試數據導入或導出到數據庫中。


我歷來在根據環境引導做到了這一點,以及 - 我嘗試從來沒有讓那些域假設/約束太遠不同步。與我的模式。

下面是我在談論佳能:

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") 
//... 
+0

嗨邁克,我沒有進行集成測試,只是試圖插入從我被給予的文件中的一堆記錄。無論如何bootstrap鉤子也可以是有用的,並感謝指出db-stuff插件。 – 2010-12-04 22:48:01