【问题标题】:NAnt: How to Load External NAnt Scripts Inside A Custom TaskNAnt:如何在自定义任务中加载外部 NAnt 脚本
【发布时间】:2013-06-15 18:41:44
【问题描述】:

简而言之,我的问题是:

如何在自定义任务中加载 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" />

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


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

【问题讨论】:

    标签: nant


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多