Gant – the lightweight and Groovy
                   scripting framework


                                 Dr Russel Wind...
Aims and Objectives of the Session

                       ●    Look at Gant as a way of:
                                ...
Structure of the Session

                       ●    Do stuff.
                       ●    Exit stage (left|right).




 ...
Protocol for the Session

                       ●    A sequence of slides, interrupted by various bits of
               ...
Blatant Advertising

                       Python for Rookies
                       Sarah Mount, James Shuttleworth and
...
XML

                       ●    Does anyone like programming using XML?
                                 –   Ant has alwa...
gs/XML/Groovy/g

                       ●    Gant started as an Ant-   ●   Gradle (and SCons)
                            ...
If Gradle, why Gant?

                       ●    Gant is a lightweight target-oriented scripting system
                 ...
Gant Scripts . . .

                       ●    Are Groovy scripts.
                       ●    Have targets as well as ot...
Targets are . . .
                                                        Think Fortran entry statement
                  ...
Hello World

                     def helloWorld ( ) {
                       println ( 'Hello World.' )                  ...
Hello World – 2

                def helloWorld ( ) {
                  println ( 'Hello World.' )
                }
     ...
HelloWorld – 3


         def helloWorld ( ) {
           println ( 'Hello World.' )
         }
         target ( doHelloW...
Hello World – 4


           def helloWorld ( ) {
             println ( 'Hello World.' )
           }
           target (...
Hello World – 5 & 6
    def helloWorld = {
      println ( 'Hello World.' )                             These work, but is...
Hello World – 7 & 8

  def helloWorld = {                                           The global hooks are
    println ( 'He...
Hello World – 9 & 10

    def helloWorld = {
      println ( 'Hello World.' )
    }
    target ( name : 'printHelloWorld' ...
Hello World – 11 & 12

        def helloWorld = {
          println ( 'Hello World.' )
        }
        target ( name : '...
Hello World – 13 & 14



         target ( 'Hello World.' : 'Print Hello World.' ) { println ( it.name ) }
         setDef...
Doing More Than One Thing At Once

                       ●    The world is a parallel place – multicore is now the
      ...
GPars is Groovy Parallelism

                       ●    Was GParallelizer is now GPars.
                       ●    http:...
Actors and Data Parallelism

                       ●    Some examples of using GPars in Groovy.
                       ● ...
Summary

                       ●    Interesting things were said.
                       ●    People enjoyed the session....
Unabashed Advertising




                                 You know you want to buy them!
Copyright © 2008 Russel Winder  ...
GPars Logo Contest

                       ●    GPars project is having a logo contest: See
                            ht...
Upcoming SlideShare
Loading in …5
×

Gant, the lightweight and Groovy targeted scripting framework

1,488 views

Published on

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

Published in: Technology
1 Comment
0 Likes
Statistics
Notes
  • watch this talk at

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

No Downloads
Views
Total views
1,488
On SlideShare
0
From Embeds
0
Number of Embeds
99
Actions
Shares
0
Downloads
0
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

Gant, the lightweight and Groovy targeted scripting framework

  1. 1. Gant – the lightweight and Groovy scripting framework Dr Russel Winder Partner, Concertant LLP russel.winder@concertant.com Copyright © 2009 Russel Winder 1
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 23. Summary ● Interesting things were said. ● People enjoyed the session. Copyright © 2009 Russel Winder 23
  24. 24. Unabashed Advertising You know you want to buy them! Copyright © 2008 Russel Winder 24
  25. 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

×