2010-12-03 2 views
5

Обновление: от Grails 1.3.6 имеет доступ к полному домену из сценариев Gant. От Grails 1.3.6 release notes:одноразовый скрипт grails для заполнения базы данных

Теперь вы можете запустить один или несколько сценариев Groovy из командной строки, используя команду run-script, например.

Grails запустить-скрипт [путь-к-скрипт-1] [путь к сценарию-2] ... [путь к сценарию-н]

Это работает вокруг проблемы в сценариях Gant где вы не можете удобно обращаться к классам приложений, поскольку они недоступны в пути к классам при запуске скриптов.


Привет всем,

Я новичок в использовании Grails (в реальном проекте) и у меня есть один-офф сценарий мне нужно выполнить, который читает файл, а затем заполняет мою базу данных.

Я хотел, чтобы сценарий запускался в контексте моего приложения grails, поэтому я использовал команду create-script. Теперь я понимаю, что это сценарий «Гант». Причиной для этого было то, что я думал, что это позволит мне легкий доступ ко всем 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 (упомянутый Джаредом выше) для работы с граалями 1.3.5. Я хотел бы сделать это некоторое время, но этот вопрос подтолкнул меня, наконец, обойти его).

Просто скачайте скрипт, описанный в посте, сохранить его в ваших Грааль «сценарии» каталог, а затем вы можете запустить свой собственный заводной сценарий для начальной загрузки данных с:

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

Огромное спасибо Тед! – 2010-12-04 14:02:19

1

Я должен был сделать это, и вы должны создать специальный скрипт, чтобы получить доступ к GORM от стандартного Grails сценария. См. this question для получения дополнительной информации. Я не уверен, что текущий статус скрипта находится под grails 1.3, но автор сценария размещен в комментариях.

6

Я знаю, что сценарии полезны, и я, вероятно, получаю почту ненависти даже за предложение, но я только что включил этот материал в мое приложение в прошлом.

У меня есть флаг, установленный в моей конфигурации, который указывает, следует ли загружать данные, если это так, код начальной загрузки ищет файл с разделителями-запятыми при запуске и вызывает метод службы для загрузки данных.

1

Ганса, есть несколько вариантов здесь , предполагая, что вы не собираетесь полировать GANT скриптовые отбивные 8 ^)

Так что предположим, что вы делаете TDD с интеграционным режимом, правильно? Вы заглянули в плагин db-stuff? Фактически, один использует пакет с открытым исходным кодом (расширение проекта JUnit), называемый dbUnit, что также является выдающимся выбором для проектов Java и Groovy.

* db-stuff < 0.3.0> - управление схемой db и импорт/экспорт данных. Создавайте общие файлы схем и импортируйте или экспортируйте данные базы/семени/теста в вашу базу данных.


Я традиционно делал это, а также в 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") 
//... 
+0

Привет, Майк, я не делаю интеграционных тестов, просто пытаюсь вставить кучу записей из файла, который мне был дан. Во всяком случае, загрузочный крючок также может быть полезен, и спасибо за указание плагина db-stuff. – 2010-12-04 22:48:01

Смежные вопросы