Grails Goodness: Extending IntegrateWith Command
We can extend the integrate-with
command in Grails to generate files for a custom IDE or build system. We must add a _Events.groovy
file to our Grails projects and then write an implementation for the eventIntegrateWithStart
event. Inside the event we must define a new closure with our code to generate files. The name of the closure must have the following pattern: binding.integrate_CustomIdentifier_
. The value for CustomIdentifier can be used as an argument for the integrate-with
command.
Suppose we want to extend integrate-with
to generate a simple Sublime Text project file. First we create a template Sublime Text project file where we define folders for a Grails application. We create the folder src/ide-support/sublimetext
and add the file grailsProject.sublimetext-project
with the following contents:
{
"folders": [
{
"name": "Domain classes",
"path": "grails-app/domain"
},
{
"name": "Controllers",
"path": "grails-app/controllers"
},
{
"name": "Taglibs",
"path": "grails-app/taglib"
},
{
"name": "Views",
"path": "grails-app/views"
},
{
"name": "Services",
"path": "grails-app/services"
},
{
"name": "Configuration",
"path": "grails-app/conf"
},
{
"name": "grails-app/i18n",
"path": "grails-app/i18n"
},
{
"name": "grails-app/utils",
"path": "grails-app/utils"
},
{
"name": "grails-app/migrations",
"path": "grails-app/migrations"
},
{
"name": "web-app",
"path": "web-app"
},
{
"name": "Scripts",
"path": "scripts"
},
{
"name": "Sources:groovy",
"path": "src/groovy"
},
{
"name": "Sources:java",
"path": "src/java"
},
{
"name": "Tests:integration",
"path": "test/integration"
},
{
"name": "Tests:unit",
"path": "test/unit"
},
{
"name": "All files",
"follow_symlinks": true,
"path": "."
}
]
}
Next we create the file scripts/_Events.groovy
:
includeTargets << grailsScript("_GrailsInit")
eventIntegrateWithStart = {
// Usage: integrate-with --sublimeText
binding.integrateSublimeText = {
// Copy template file.
ant.copy(todir: basedir) {
fileset(dir: "src/ide-support/sublimetext/")
}
// Move template file to real project file with name of Grails application.
ant.move(file: "$basedir/grailsProject.sublime-project",
tofile: "$basedir/${grailsAppName}.sublime-project",
overwrite: true)
grailsConsole.updateStatus "Created SublimeText project file"
}
}
We are done and can now run the integrate-with
command with the new argument sublimeText
:
$ grails integrate-with --sublimeText
| Created SublimeText project file.
$
If we open the project in Sublime Text we see our folder structure for a Grails application:
Code written with Grails 2.3.7.