编写一个自定义的NAnt任务,能够使用过滤器。

3

我正在尝试编写一个自定义的NAnt任务,执行一些基于文件的操作。其中一个非常有用的功能是能够在输入文件中运行<expandproperties>过滤器。

为了保持任务的通用性,我只想支持<filterchain>元素(类似于<copy>任务的工作方式)。

我一直在使用<copy>任务的源代码来指导我,但是我一直遇到一些在编写任务时是内部方法的问题。我知道可以使用反射来打破封装,但我不愿意这样做。

有人知道任何有用的文章,或者有任何经验吗?

1个回答

1

我开始创建一个私有的Filter子类,它接受一个TextReader(基本上是在NAnt源代码中重新创建PhysicalTextReader)。然而,我意识到,实际上,通过过滤器链读取文件有更简单的方法:

[TaskName("mytask")]
public class MyTask : Task
{
    /// <summary>
    /// Chain of filters used to alter the input file's content as it is read.
    /// </summary>
    [BuildElement("filterchain")]
    public FilterChain Filters { get; set; }

    /// <summary>
    /// The input file.
    /// </summary>
    [TaskAttribute("input")]
    public FileInfo InputFile { get; set; }

    protected override void ExecuteTask()
    {
        Log(FileUtils.ReadFile(InputFile.FullName, Filters, null));
    }
}

然后您可以像预期的那样使用它:

<mytask input="foo.txt">
    <filterchain>
        <expandproperties />
    </filterchain>
</mytask>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接