Steve Appling wrote:
I have a proof of concept implementation of some of this at git://github.com/sappling/gradle.git in the "opt" branch.


This looks pretty good. Some comments below.

This includes:
1) A new onlyIf method on Task

We will need an overload of onlyIf() which takes a TaskAction, so that build logic implemented in Java (eg the Java plugin) can make use of this too.

2) A new didWork method on Task

The didWork property should default to false, until the execute() method first executes a task action, when it should change to true.

3) Implementations of didWork for Compile and GroovyCompile.

Could you add some unit test coverage for this?

I don't think that we can handle Ant's Copy task in this same way. We may have to use a replacement, but this has other consequences. 4) Changes to src/samples/java/quickstart/build.gradle to demo didWork and onlyIf.

I don't think these belong in the quickstart sample. It would be unfortunate if users really had to think about optimisation when being introduced to their very first Gradle build. A better place for this would be in the Java plugin.

Some integration test coverage would be good too.

5) A start at OptimizationHelper.isNeeded method. This will require some additional dependency management features, so I stopped development until I got some feedback on this whole approach.


I'm still not convinced about this one. I'd rather get the above bits into the 0.7 release and leave this one out until we have a better idea of how it should work (which may also be in time for 0.7). If we have Task.onlyIf(), one can very easily add an equivalent of isNeeded() in their build script.

Steve Appling wrote:
I am interested in ways to short circuit task execution for the purpose of optimization. I would love to see some of this in 0.7 and would be glad to contribute.

Here are some ideas:
1) Add an "onlyIf" method to Task that is given a closure. The closure would be executed before the first action of the task and would cancel execution of the task (with appropriate lifecycle message) if it returned false. This closure would have as a delegate an optimization container with some helper methods that would provide more convenient access to change detection (among other things). Then you could do:
  mytask.onlyIf {
    timestampChanged 'src/main/mysrc'
    // or contentsChanged 'src/main/mysrc'
  }

2) Running a clean should probably remove the change detection state information for a project (or at least the clean task should be able to be configured to do this conveniently).

3) I would like some general way for tasks to indicate that they did anything. Perhaps task.getDidWork(). BTW, I figured out how to do this for gradle's use of ant.javac and can now tell if it really compiled anything.

4) I would like to be able to specify that a chain of dependent tasks only execute a task if Task.didWork is true for all of its dependents. Note that this is not always desired, so you need to be able to turn this on and off. I'm not sure of the best way to configure this. If we use the onlyIf method suggested above, it might take another closure to check this that would be returned from a "needed" method. This would look like:
  myTask.onlyIf(needed())

This probably should be the default for tests, but perhaps not for all Tasks.

Javac is already checking to see if the source files are out of date with the classes, so I don't think that the javac task needs to use the new changedetection. This would, however let you stop other tasks in the chain (like test) if nothing needed to be compiled. (unrelated: I would also like to see an option on compile to use Ant's depend task. I think the current dependencyTracking option doesn't work with the modern compiler. )

Other types of tasks could make good use of Tom's change detection.

5) We probably want a command line option to be able to disable all of these optimizations. Sometimes you really want to force a build with no optimizations (without running clean).


In the race for speed, Gradle will probably never catch Ant in a clean build (at least while you are delegating most of the expensive stuff to ant). However, most of the time developers are doing incremental changes on existing systems and not running clean. In this case, if Gradle can support features to conveniently bypass unneeded steps, it can be much faster. Also, Gradle has a huge advantage of a more maintainable and modular build specification.



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

   http://xircles.codehaus.org/manage_email


Reply via email to