On Mon, Jun 25, 2012 at 12:14 PM, Robert Fischer < [email protected]> wrote:
> This is what "clean" is there for. It's a common problem caused by the > fact that the build system doesn't know what output files require > which other output files, or which input files produced which output > files. But, of course, we can always teach it what the rules are. > > I'm not asking that build system to magically know; I'd assume that mapping would be trapped inside a bit of my code. I'm slightly off-put by the direction to use "clean"; as I understood it, part of the appeal of Gradle is never having to use "clean". > You could also add a filter in your input to exclude an input file if > the last modified time of the input file is less than the last > modified time of the output file. > That's kind of where I'm headed, though for the meantime, I'm deleting the output directory early, and just re-building all .js from all .coffee. > > If you know the mapping, you could always wipe out the bogus output > files first based in the input file names, although I don't know a > clever/declarative Gradle way of specifying that behavior. At least, > not off the top of my head...there might be some clever filtering > manipulation you could perform. > I'm kind of picturing some additional method annotations for method to be invoked when a source file from a previous build no longer exists. That would be very handy, since my code could re-do the mapping from input file to output file and delete the output file. > > If you want to add that code, though, you're hitting "plugin" levels > of complexity pretty quick here. > My goal is to turn this into a plugin ... except that it looks like 1.1 will have (experimental) support for this out-of-the-box. > > ~~ Robert. > > > On Mon, Jun 25, 2012 at 12:39 PM, Howard Lewis Ship <[email protected]> > wrote: > > I've been working on a little script to assist with compiling > CoffeeScript > > for my project. I have it partially working, but am seeking some help on > > making it completely correct. > > > > Here's the main code: > > > > coffeescript.gradle: > > import ro.isdc.wro.model.resource.* > > import ro.isdc.wro.extensions.processor.js.* > > > > buildscript { > > repositories { mavenCentral() } > > dependencies { > > classpath "ro.isdc.wro4j:wro4j-extensions:${versions.wro4j}" > > } > > } > > > > class CompileCoffeeScript extends DefaultTask { > > def srcDir = "src/main/coffeescript" > > > > def outputDir = "${project.buildDir}/compiled-coffeescript" > > > > @InputDirectory > > File getSrcDir() { project.file(srcDir) } > > > > @OutputDirectory > > File getOutputDir() { project.file(outputDir) } > > > > @TaskAction > > void doCompile() { > > logger.info "Compiling CoffeeScript sources from $srcDir into > > $outputDir" > > > > def tree = project.fileTree srcDir, { > > include '**/*.coffee' > > } > > > > tree.visit { visit -> > > if (visit.directory) return > > > > def inputFile = visit.file > > def inputPath = visit.path > > def outputPath = inputPath.replaceAll(/\.coffee$/, '.js') > > def outputFile = new File(outputDir, outputPath) > > > > logger.info "Compiling ${inputPath}" > > > > outputFile.parentFile.mkdirs() > > > > def resource = Resource.create(inputFile.absolutePath, > > ResourceType.JS) > > > > new CoffeeScriptProcessor().process(resource, > inputFile.newReader(), > > outputFile.newWriter()) > > } > > } > > > > } > > > > project.ext.CompileCoffeeScript = CompileCoffeeScript > > > > And here's what I've added to my main build script: > > > > apply from: "coffeescript.gradle" > > > > task compileCoffeeScript(type: CompileCoffeeScript) > > > > processResources { > > from compileCoffeeScript > > } > > > > > > This works partially: when I change a source .coffee file, or add a new > > .coffee file, then all of the .coffee files are recompiled to JavaScript > and > > included in the output JAR file (that is, task jar depends on task > > processResources which now depends on task compileCoffeeScript). > > > > However, if I delete an input file, I'm only getting partial behavior: > > > > :tapestry-core:compileCoffeeScript > > Executing task ':tapestry-core:compileCoffeeScript' due to: > > Input file > > > /Users/hlship/workspaces/tapestry/tapestry5/tapestry-core/src/main/coffeescript/proto/bye.coffee > > for task ':tapestry-core:compileCoffeeScript' removed. > > Compiling CoffeeScript sources from src/main/coffeescript into > > > /Users/hlship/workspaces/tapestry/tapestry5/tapestry-core/build/compiled-coffeescript > > Compiling proto/hello.coffee > > :tapestry-core:processResources > > > > > > ... but I see the output .js file for the deleted input .coffee file > still > > in the JAR (and in build/compiled-coffeescript). In other words, > deleting a > > source file does not cause the previously generated output file to be > > deleted. > > > > Secondly, and perhaps this is related, when I change ANY .coffee file, > then > > ALL .coffee files are recompiled. CoffeeScript is unlike Java, each > file is > > pretty much independent of all others (it's all going to be very late > bound > > inside the client browser). > > > > So ... should I simply delete the output directory inside my doCompile() > > method? Given the message in the console output above, it seems like > there > > could be a notification to a task that an input file was deleted and it > > should ensure the corresponding output file(s) are deleted. > > > > But if I want a more "incremental" style, am I expected to walk the > output > > directory and delete anything that doesn't have a corresponding source > file? > > > > And, is there a base class to extend from that handles more of this for > me? > > SourceTask doesn't seem to do quite what I want. > > > > Thanks in advance for any guidance. > > > > $ gradle --version > > > > ------------------------------------------------------------ > > Gradle 1.0 > > ------------------------------------------------------------ > > > > Gradle build time: Tuesday, June 12, 2012 12:56:21 AM UTC > > Groovy: 1.8.6 > > Ant: Apache Ant(TM) version 1.8.2 compiled on December 20 2010 > > Ivy: 2.2.0 > > JVM: 1.7.0_04 (Oracle Corporation 23.0-b21) > > OS: Mac OS X 10.7.4 x86_64 > > > > > > -- > > Howard M. Lewis Ship > > > > Creator of Apache Tapestry > > > > The source for Tapestry training, mentoring and support. Contact me to > learn > > how I can get you up and productive in Tapestry fast! > > > > (971) 678-5210 > > http://howardlewisship.com > > --------------------------------------------------------------------- > To unsubscribe from this list, please visit: > > http://xircles.codehaus.org/manage_email > > > -- Howard M. Lewis Ship Creator of Apache Tapestry The source for Tapestry training, mentoring and support. Contact me to learn how I can get you up and productive in Tapestry fast! (971) 678-5210 http://howardlewisship.com
