<target name="process" description="Builds recursively all subprojects"> <foreach item="Folder" property="foldername"> <in> <items> <includes name="*"/> <excludes name="CVS"/> </items> </in> <do> <nant buildfile="${foldername}/default.build" target="${project.config} ${operation}"/> </do> </foreach> </target>
The master just needs to set the "operation" property before calling. I'm not certain these wildcard targets are necessary in this case.
<property name="operation" value="build" /> <nant buildfile="gateway.build" target="process" />
etc...
Giuseppe Greco wrote:
Hi all,
I've just completed the implementation of the stuff we discussed yesterday.
Right now I'm out of office and I don't have CVS access due to proxy restrictions, so attached to this email you will find the modified files. I'll send you a patch tomorrow.
The modified files are:
NAnt.Core/Project.cs line 81 added WildTarget const line 132 added _currentTarget field lines 410 - 416 added CurrentTarget property lines 784 - 796 replaced do-while statement lines 1415 - 1419 added wild targets handling
NAnt.Core/Functions/NAntFunctions.cs lines 83 - 98 added GetCurrentTarget functioin
These modifications allow you to specify a wild target that is executed when the user specifies a target that does not exist in the current build file. Here's an example:
<project name="myProject" default="build">
<target name="build"> <echo message="This is the build target."/> </target>
<target name="*"> <echo message="This is the ${target::get-current-target()} target."/> </target> </project>
if you type
nant hello
from the command, you get the message "This is the hello target".
Furthermore, using the master-gateway-slave build file pattern is much easier (see my previous emails). Here below is another example.
Let's start with the usual project:
/myProject + default.build + /src + default.build + /Subproject + default.build + HelloWorld.cs
the master build file (/myProject/default.build) looks like this:
<?xml version="1.0"?>
<project name="myProject" default="build">
<target name="build" description="Builds the current configuration"> <nant buildfile="src/default.build" target="${target::get-current-target()}"/> </target>
<target name="test" description="Tests the current configuration"> <nant buildfile="src/default.build" target="${target::get-current-target()}"/> </target>
<target name="clean" description="Deletes the current configuration"> <nant buildfile="src/default.build" target="${target::get-current-target()}"/> </target>
</project>
... and the gateway build file (/myProject/src/default.build) like this:
<?xml version="1.0"?>
<project name="myProject" default="*">
<target name="*" description="Builds recursively all subprojects"> <foreach item="Folder" property="foldername"> <in> <items> <includes name="*"/> <excludes name="CVS"/> </items> </in> <do> <nant buildfile="${foldername}/default.build" target="${project.config} ${target::get-current-target()}"/> </do> </foreach> </target>
</project>
I don't report the slave build file (/myProject/src/Subproject/default.build) since it is like any other build file written till now.
Wild targets allow you to write more compact build files and provide a standard way to handle unexpected targets.
What do you think about that?
j3d.
---------------------------------------- Giuseppe Greco
::agamura::
phone: +41 (0)91 604 67 65 mobile: +41 (0)76 390 60 32 email: [EMAIL PROTECTED] web: www.agamura.com ----------------------------------------
------------------------------------------------------- SF.Net is sponsored by: Speed Start Your Linux Apps Now. Build and deploy apps & Web services for Linux with a free DVD software kit from IBM. Click Now! http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click _______________________________________________ nant-developers mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/nant-developers