/* * Copyright 2004-2005 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Gant script that handles general initialization of a Grails applications * * @author Graeme Rocher * * @since 0.4 */ import grails.util.GrailsUtil import org.springframework.core.io.FileSystemResource import grails.util.GrailsNameUtils import groovy.grape.Grape import grails.util.Metadata Grape.enableAutoDownload = true // add includes includeTargets << grailsScript("_GrailsArgParsing") includeTargets << grailsScript("_PluginDependencies") exit = { event("Exiting", [it]) // Prevent system.exit during unit/integration testing if (System.getProperty("grails.cli.testing")) { throw new RuntimeException("Gant script exited") } else { System.exit(it) } } // Generates Eclipse .classpath entries for all the Grails dependencies, // i.e. a string containing a "" element for each // of Grails' library JARs. This only works if $GRAILS_HOME is set. eclipseClasspathLibs = { def result = '' if (grailsHome) { (new File("${grailsHome}/lib")).eachFileMatch(~/.*\.jar/) {file -> if (!file.name.startsWith("gant-")) { result += "\n\n" } } } result } // Generates Eclipse .classpath entries for the Grails distribution // JARs. This only works if $GRAILS_HOME is set. eclipseClasspathGrailsJars = {args -> result = '' if (grailsHome) { (new File("${grailsHome}/dist")).eachFileMatch(~/^grails-.*\.jar/) {file -> result += "\n\n" } } result } confirmInput = {String message, code="confirm.message" -> if(!isInteractive) { println("Cannot ask for input when --non-interactive flag is passed. You need to check the value of the 'isInteractive' variable before asking for input") exit(1) } ant.input(message: message, addproperty: code, validargs: "y,n") def result = ant.antProject.properties[code] (result == 'y') } target(createStructure: "Creates the application directory structure") { ant.sequential { mkdir(dir: "${basedir}/src") mkdir(dir: "${basedir}/src/java") mkdir(dir: "${basedir}/src/groovy") mkdir(dir: "${basedir}/grails-app") mkdir(dir: "${basedir}/grails-app/controllers") mkdir(dir: "${basedir}/grails-app/services") mkdir(dir: "${basedir}/grails-app/domain") mkdir(dir: "${basedir}/grails-app/taglib") mkdir(dir: "${basedir}/grails-app/utils") mkdir(dir: "${basedir}/grails-app/views") mkdir(dir: "${basedir}/grails-app/views/layouts") mkdir(dir: "${basedir}/grails-app/i18n") mkdir(dir: "${basedir}/grails-app/conf") mkdir(dir: "${basedir}/test") mkdir(dir: "${basedir}/test/unit") mkdir(dir: "${basedir}/test/integration") mkdir(dir: "${basedir}/scripts") mkdir(dir: "${basedir}/web-app") mkdir(dir: "${basedir}/web-app/js") mkdir(dir: "${basedir}/web-app/css") mkdir(dir: "${basedir}/web-app/images") mkdir(dir: "${basedir}/web-app/META-INF") mkdir(dir: "${basedir}/lib") mkdir(dir: "${basedir}/grails-app/conf/spring") mkdir(dir: "${basedir}/grails-app/conf/hibernate") } } target(checkVersion: "Stops build if app expects different Grails version") { if (metadataFile.exists()) { if (appGrailsVersion != grailsVersion) { event("StatusFinal", ["Application expects grails version [$appGrailsVersion], but GRAILS_HOME is version " + "[$grailsVersion] - use the correct Grails version or run 'grails upgrade' if this Grails " + "version is newer than the version your application expects."]) exit(1) } } else { // We know this is pre-0.5 application event("StatusFinal", ["Application is pre-Grails 0.5, please run: grails upgrade"]) exit(1) } } target(updateAppProperties: "Updates default application.properties") { def entries = [ "app.name": "$grailsAppName", "app.grails.version": "$grailsVersion" ] if (grailsAppVersion) { entries["app.version"] = "$grailsAppVersion" } updateMetadata(entries) // Make sure if this is a new project that we update the var to include version appGrailsVersion = grailsVersion } target( launderIDESupportFiles: "Updates the IDE support files (Eclipse, TextMate etc.), changing file names and replacing tokens in files where appropriate.") { ant.move(file: "${basedir}/.launch", tofile: "${basedir}/${grailsAppName}.launch", overwrite: true) ant.move(file: "${basedir}/test.launch", tofile: "${basedir}/${grailsAppName}-test.launch", overwrite: true) ant.move(file: "${basedir}/project.tmproj", tofile: "${basedir}/${grailsAppName}.tmproj", overwrite: true) def appKey = grailsAppName.replaceAll( /\s/, '.' ).toLowerCase() ant.replace(dir:"${basedir}", includes:"*.*") { replacefilter(token: "@grails.libs@", value: eclipseClasspathLibs()) replacefilter(token: "@grails.jar@", value: eclipseClasspathGrailsJars()) replacefilter(token: "@grails.version@", value: grailsVersion) replacefilter(token: "@grails.project.name@", value: grailsAppName) replacefilter(token: "@grails.project.key@", value: appKey) } } target(init: "main init target") { depends(createStructure, updateAppProperties) grailsUnpack(dest: basedir, src: "grails-shared-files.jar") grailsUnpack(dest: basedir, src: "grails-app-files.jar") launderIDESupportFiles() classpath() // Create a message bundle to get the user started. touch(file: "${basedir}/grails-app/i18n/messages.properties") // Set the default version number for the application updateMetadata( "app.version": grailsAppVersion ?: "0.1", "app.servlet.version": servletVersion) } logError = { String message, Throwable t -> GrailsUtil.deepSanitize(t) t.printStackTrace() event("StatusError", ["$message: ${t.message}"]) } logErrorAndExit = { String message, Throwable t -> logError(message, t) exit(1) }