Gant, the lightweight and Groovy targeted scripting framework

  • 1,212 views
Uploaded on

Russel presented these slides during a very interesting (and entertaining!) talk on GANT at the Skills Matter Groovy & Grails eXchange 2009. …

Russel presented these slides during a very interesting (and entertaining!) talk on GANT at the Skills Matter Groovy & Grails eXchange 2009.

Find a podcast of Russel's talk here: http://skillsmatter.com/podcast/java-jee/gant-the-lightweight-and-groovy-targeted-scripting-framework/zx-489

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • watch this talk at

    http://skillsmatter.com/podcast/java-jee/gant-the-lightweight-and-groovy-targeted-scripting-framework/zx-489
    Are you sure you want to
    Your message goes here
    Be the first to like this
No Downloads

Views

Total Views
1,212
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
0
Comments
1
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Gant – the lightweight and Groovy scripting framework Dr Russel Winder Partner, Concertant LLP russel.winder@concertant.com Copyright © 2009 Russel Winder 1
  • 2. Aims and Objectives of the Session ● Look at Gant as a way of: – Defining a set of targets. – Scripting Ant tasks. – Using AntBuilder. – Using the Groovy meta-object protocol. Have a structured “chin wag” that is (hopefully) both illuminating and enlightening. Copyright © 2009 Russel Winder 2
  • 3. Structure of the Session ● Do stuff. ● Exit stage (left|right). There is significant dynamic binding to the session so the above is just a set of place holders. Copyright © 2009 Russel Winder 3
  • 4. Protocol for the Session ● A sequence of slides, interrupted by various bits of code. ● Example executions of code – with the illuminating presence of a system monitor. ● Questions (and, indeed, answers) from the audience as and when they crop up. If an interaction looks like it is getting too involved, we reserve the right to stack it for handling after the session. Copyright © 2009 Russel Winder 4
  • 5. Blatant Advertising Python for Rookies Sarah Mount, James Shuttleworth and Russel Winder Thomson Learning Now called Cengage Learning. Developing Java Software Third Edition Russel Winder and Graham Roberts Wiley Buy these books! Copyright © 2009 Russel Winder 5
  • 6. XML ● Does anyone like programming using XML? – Ant has always claimed Ant scripts are declarative programs – at least that is better than trying to write imperative programs using XML. – Most Ant scripts exhibit significant control flow tendencies. Copyright © 2009 Russel Winder 6
  • 7. gs/XML/Groovy/g ● Gant started as an Ant- ● Gradle (and SCons) style build tool using shows that build is Groovy instead of XML better handled using a to specify the build. system that works using a directed acyclic graph ● Ant <-> Maven warfare, of all dependencies. configuration vs. convention. Real Programmers use ed. Copyright © 2009 Russel Winder 7
  • 8. If Gradle, why Gant? ● Gant is a lightweight target-oriented scripting system built on Groovy and its AntBuilder. ● Gradle is a build framework. Gant is lightweight, Gradle is a little more serious. Lightweight means embeddable, hence it being used in Grails. Copyright © 2009 Russel Winder 8
  • 9. Gant Scripts . . . ● Are Groovy scripts. ● Have targets as well as other code. ● Are executed directly – no data structure building phase as with Gradle and SCons. Use functions, closures, etc. to structure the code and make the targets the multiple entries into the codebase. Copyright © 2009 Russel Winder 9
  • 10. Targets are . . . Think Fortran entry statement ● The entry points. ● Callable -- targets are closures and hence callable from other targets and indeed any other code, but this is a bad coding strategy. ● Independent – there is no way of specifying dependencies of one target on another except by executing code. Cf. depends function. Although targets become closures, treat them as entry points, not callables. Copyright © 2009 Russel Winder 10
  • 11. Hello World def helloWorld ( ) { println ( 'Hello World.' ) Parameter is a Map } target ( 'default' : 'The default target.' ) { helloWorld ( ) } |> gant -p -f helloWorld.gant default The default target. Default target is default. |> Copyright © 2009 Russel Winder 11
  • 12. Hello World – 2 def helloWorld ( ) { println ( 'Hello World.' ) } target ( printHelloWorld : 'Print Hello World.' ) { helloWorld ( ) } setDefaultTarget ( printHelloWorld ) |> gant -p -f helloWorld_2.gant printHelloWorld Print Hello World. Default target is printHelloWorld. |> Copyright © 2009 Russel Winder 12
  • 13. HelloWorld – 3 def helloWorld ( ) { println ( 'Hello World.' ) } target ( doHelloWorldPrint : 'Print Hello World.' ) { helloWorld ( ) } target ( printHelloWorld : 'Force doHelloWorldPrint to be achieved.' ) { depends ( doHelloWorldPrint ) } setDefaultTarget ( printHelloWorld ) Copyright © 2009 Russel Winder 13
  • 14. Hello World – 4 def helloWorld ( ) { println ( 'Hello World.' ) } target ( printHelloWorld : 'Force doHelloWorldPrint to be achieved.' ) { depends ( helloWorld ) } setDefaultTarget ( printHelloWorld ) This does not work :-( Copyright © 2009 Russel Winder 14
  • 15. Hello World – 5 & 6 def helloWorld = { println ( 'Hello World.' ) These work, but is it } better to make the target ( printHelloWorld : 'Print Hell World.' ) { variable local or use depends ( helloWorld ) the global binding? } setDefaultTarget ( printHelloWorld ) helloWorld = { println ( 'Hello World.' ) } target ( printHelloWorld : 'Print Hell World.' ) { depends ( helloWorld ) } setDefaultTarget ( printHelloWorld ) Copyright © 2009 Russel Winder 15
  • 16. Hello World – 7 & 8 def helloWorld = { The global hooks are println ( 'Hello World.' ) just variables in the } binding – callable or globalPreHook = helloWorld list of callables target ( printHelloWorld : 'Print Hello World.' ) { } assumed. setDefaultTarget ( printHelloWorld ) def helloWorld = { println ( 'Hello World.' ) } globalPostHook = [ helloWorld ] target ( printHelloWorld : 'Print Hello World.' ) { } setDefaultTarget ( printHelloWorld ) Copyright © 2009 Russel Winder 16
  • 17. Hello World – 9 & 10 def helloWorld = { println ( 'Hello World.' ) } target ( name : 'printHelloWorld' , description : 'Print Hello World.' , addprehook : helloWorld ) { } setDefaultTarget ( printHelloWorld ) def helloWorld = { println ( 'Hello World.' ) } target ( name : 'printHelloWorld' , description : 'Print Hello World.' , addposthook : helloWorld ) { } setDefaultTarget ( printHelloWorld ) Copyright © 2009 Russel Winder 17
  • 18. Hello World – 11 & 12 def helloWorld = { println ( 'Hello World.' ) } target ( name : 'printHelloWorld' , description : 'Print Hello World.' , prehook : helloWorld ) { } setDefaultTarget ( printHelloWorld ) def helloWorld = { println ( 'Hello World.' ) } target ( name : 'printHelloWorld' , description : 'Print Hello World.' , posthook : helloWorld ) { } setDefaultTarget ( printHelloWorld ) Copyright © 2009 Russel Winder 18
  • 19. Hello World – 13 & 14 target ( 'Hello World.' : 'Print Hello World.' ) { println ( it.name ) } setDefaultTarget ( 'Hello World.' ) target ( printHelloWorld : 'Hello World.' ) { println ( it.description ) } setDefaultTarget ( printHelloWorld ) Copyright © 2009 Russel Winder 19
  • 20. Doing More Than One Thing At Once ● The world is a parallel place – multicore is now the norm. ● Workstations have 2, 3, 4, 6, 8, . . . cores. ● Sequential, uniprocessor thinking is now archaic. Copyright © 2009 Russel Winder 20
  • 21. GPars is Groovy Parallelism ● Was GParallelizer is now GPars. ● http://gpars.codehaus.org ● Will have a selection of tools: – Actors – Active objects – Dataflow – CSP CSP – Communicating Sequential Processes Copyright © 2009 Russel Winder 21
  • 22. Actors and Data Parallelism ● Some examples of using GPars in Groovy. ● Some examples of using GPars in Gant. Copyright © 2009 Russel Winder 22
  • 23. Summary ● Interesting things were said. ● People enjoyed the session. Copyright © 2009 Russel Winder 23
  • 24. Unabashed Advertising You know you want to buy them! Copyright © 2008 Russel Winder 24
  • 25. GPars Logo Contest ● GPars project is having a logo contest: See http://docs.codehaus.org/display/GPARS/Logo+Contest ● Closing date for entries was 2009-11-30. ● Voting is now happening. Late entries are not accepted, though if significant bribes to the organizer are involved . . . Copyright © 2008 Russel Winder 25