Question

In short, my problem is:

How to load an NAnt script in side a custom task, and execute it?


Detailed explanation:

In our current project build, we need to execute external programs. The external programs need to be located before the build kicks off. (coz it takes so looong time)

What I want is to have some NAnt module, like those FindXXX.cmake modules in CMake, so I can have modules like:

<?xml version="1.0"?>
<project name="FindSQLServerCore" default="FindSQLServer">
  <target name="FindSQLServer">
    <module>
      <path>
        <pathelement dir="C:\Program Files\Microsoft SQL Server\100\Tools\Binn" />
        <pathelement dir="C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn" />
      </path>
      <files>
        <file name="SQLCmd.exe" />
      </files>
    </module>
  </target>
</project>

And when I need to include SQLServer in my build script, I can do:

<find module="SQLServer" required="true" />

My way to do it is by create 2 custom tasks: FindTask & ModuleTask.

FindTask is going to locate the FindXXX.include and loaded it into current NAnt project.

ModuleTask is going to find specified file under given path and return results.

But I cannot find ways to create & execute NAnt tasks by loading a build script in FindTask. The Project.CreateTask(XmlNode) only accepts node that is already loaded but not from newly loaded XML.

Is there a way to create task by loading a build script inside a custom task? Or is my way doing this the NAnt style? Any better ways to achieve same goal?


PS. You might ask why not just use

<include file="FindSQLServer.include" />

The reason I'm not doing it this way is I want to pass the required parameter in, but not set it as a variable and pass it in.


You can get the NANT extension here:NAntFind@github

Was it helpful?

Solution

One way to load an NAnt script and execute it inside a custom task is to create a new project, and load the script using the project, then execute. Example:

var findProject = new Project(nantModule, Level.Info, Project.IndentationLevel);
findProject.Execute();

If the project fails, an exception should be thrown out.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top