NAnt:如何在自定义任务中加载外部NAnt脚本

时间:2013-06-13 08:44:39

标签: nant

简而言之,我的问题是:

如何在自定义任务中加载NAnt脚本并执行它?


详细说明:

在我们当前的项目构建中,我们需要执行外部程序。外部程序需要在构建开始之前定位。 (因为它需要如此漫长的时间)

我想要的是拥有一些NAnt模块,比如CMake中的FindXXX.cmake模块,所以我可以使用以下模块:

<?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>

当我需要在构建脚本中包含SQLServer时,我可以这样做:

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

我的方法是创建2个自定义任务: FindTask &amp;的 ModuleTask 即可。

FindTask 将找到 FindXXX.include 并将其加载到当前的NAnt项目中。

ModuleTask 将在给定路径下找到指定文件并返回结果。

但是我找不到创造和创造的方法。通过在 FindTask 中加载构建脚本来执行NAnt任务。 Project.CreateTask(XmlNode)只接受已加载的节点,但不接受新加载的XML。

有没有办法通过在自定义任务中加载构建脚本来创建任务? 或者我是这样做的NAnt风格?有没有更好的方法来实现同样的目标?


PS。您可能会问为什么不使用

<include file="FindSQLServer.include" />

我不是这样做的原因是我想传递 required 参数,但不将其设置为变量并将其传入。


您可以在此处获取NANT扩展程序:NAntFind@github

1 个答案:

答案 0 :(得分:0)

加载NAnt脚本并在自定义任务中执行它的一种方法是创建一个新项目,然后使用该项目加载脚本,然后执行。例如:

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

如果项目失败,则应抛出异常。