follow on below

 

From: Scott Pennington [mailto:spenning...@prosper.com] 
Sent: Friday, September 23, 2011 5:34 PM
To: nant-users@lists.sourceforge.net
Subject: [NAnt-users] Depends hierarchy

 

This is information that will hopefully clarify and give some insight
into how depends works in NAnt.

 

There is are a few posts out there on the net that talk about the
difference between <call target>  and  <target depends>.  What I find
that is missing are some subtle nuances when it comes to when to use
depends and when it actually has the effect you desire.

 

To review.  

<call target> will always exercise the Target.  

<target depends> will only call the targets listed in the depends if it
has not already been called.

 

The <target depends> statement is a little misleading though.  The more
accurate description is: will only call the taget(s) listed if the
calling target has not already called it through its depends. A call
will break the depends chain.  

 

The below example has two starting targets.  call.me and let.me.  These
two are designed to call two targets and those two targets each need to
have some global target to be run only once.  it is to set properties
that they both use.  (code reduction).  The difference is call.me first
calls the child targets where the let.me uses depends to call the child
targets.  Each child target spec1 and spec2 use depends to call the
global target.  

 

 

<project>

  <target name="call.me">

    <echo message="call.me" />

    <call target="spec1" />

    <call target="spec2" />

  </target>

  <target name="let.me" depends="spec1, spec2">

    <echo message="let.me" />

  </target>

  

  <target name="global">

    <echo message="global" />

  </target>

  <target name="spec1" depends="global">

    <echo message="spec1" />

  </target>

  <target name="spec2" depends="global">

    <echo message="spec2" />

  </target>

</project>

 


When I exercise call.me I got the following output.  You will notice
that global was called twice even though I had depends listed for both
children.  This did not do what I wanted.

 

C:\temp\NAnt>nant -buildfile:test-depends.build call.me

NAnt 0.90 (Build 0.90.3780.0; release; 5/8/2010)

Copyright (C) 2001-2010 Gerry Shaw

http://nant.sourceforge.net

 

Buildfile: file:///C:/temp/NAnt/test-depends.build

Target framework: Microsoft .NET Framework 3.5

Target(s) specified: call.me

 

call.me:

     [echo] call.me

global:

     [echo] global

spec1:

     [echo] spec1

global:

     [echo] global

spec2:

     [echo] spec2

BUILD SUCCEEDED

Total time: 1.4 seconds.

 

 

When I call let.me I get the blow output.  I only get global called
once.  It is also the very first thing to be called even prior to the
let.me target.  

let.me depends on spec1 

spec1 depends on global

global does not depend on anything so it is exercised. 

The call returns to spec 1 

no more depends so it is exercised

the call returns to let.me

it still depends on spec2

spec2 checks to see if global has been called and it has already and
then this restriction is fulfilled

spec2 is exercised

the call returns to let.me 

no more depends

let.me is exercised.

 

C:\temp\NAnt>nant -buildfile:test-depends.build let.me

NAnt 0.90 (Build 0.90.3780.0; release; 5/8/2010)

Copyright (C) 2001-2010 Gerry Shaw

http://nant.sourceforge.net

 

Buildfile: file:///C:/temp/NAnt/test-depends.build

Target framework: Microsoft .NET Framework 3.5

Target(s) specified: let.me

 

global:

     [echo] global

spec1:

     [echo] spec1

spec2:

     [echo] spec2

let.me:

     [echo] let.me

BUILD SUCCEEDED

 

Total time: 1.2 seconds.

 

I just ran a follow on test to just verify that a <call target> will
break the depends chain.  I created two more targets spec3 and spec4.  

 

let.me depends on spec3 depends on global and then calls spec4 which
depends on global.  You will notice that global is called twice in the
output.

 

<project>

 

  <target name="let.me" depends="spec1, spec2,spec3">

    <echo message="let.me" />

  </target>

  

  <target name="global">

    <echo message="global" />

  </target>

  <target name="spec1" depends="global">

    <echo message="spec1" />

  </target>

  <target name="spec2" depends="global">

    <echo message="spec2" />

  </target>

  <target name="spec3" depends="global">

    <echo message="spec3" />

    <call target="spec4" />

  </target>

  <target name="spec4" depends="global">

    <echo message="spec2" />

  </target>  

  </project>

 

output

 

 

C:\temp\NAnt>nant -buildfile:test-depends.build let.me

NAnt 0.90 (Build 0.90.3780.0; release; 5/8/2010)

Copyright (C) 2001-2010 Gerry Shaw

http://nant.sourceforge.net

 

Buildfile: file:///C:/temp/NAnt/test-depends.build

Target framework: Microsoft .NET Framework 3.5

Target(s) specified: let.me

 

global:

     [echo] global

spec1:

     [echo] spec1

spec2:

     [echo] spec2

spec3:

     [echo] spec3

global:

     [echo] global

spec4:

     [echo] spec2

let.me:

     [echo] let.me

 

BUILD SUCCEEDED

Total time: 1.8 seconds.

 

 

Hope you found this helpful.

 

Scott

 

 

Scott Pennington

Senior Software Engineer

Prosper Marketplace, Inc. 

111 Sutter Street, 22nd Floor

San Francisco CA 94104

www.prosper.com <http://www.prosper.com/> 

 

 






CONFIDENTIALITY STATEMENT: This email message, together with all
attachments, is intended only for the individual or entity to which it
is addressed and may contain legally privileged or confidential
information. Any dissemination, distribution or copying of this
communication by persons or entities other than the intended recipient,
is strictly prohibited, and may be unlawful. If you have received this
communication in error please contact the sender immediately and delete
the transmitted material and all copies from your system, or if received
in hard copy format, return the material to us via the United States
Postal Service. Thank you. 

------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security
threats, fraudulent activity, and more. Splunk takes this data and makes
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2dcopy2
_______________________________________________
NAnt-users mailing list
NAnt-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nant-users

Reply via email to