1

简而言之,我的问题是:

如何在自定义任务中加载 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 个自定义任务:FindTaskModuleTask

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

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

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

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


PS。你可能会问为什么不直接使用

<include file="FindSQLServer.include" />

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


你可以在这里获得 NANT 扩展:NAntFind@github

4

1 回答 1

0

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

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

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

于 2013-06-13T09:11:57.323 回答