2012-10-16 66 views
3

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

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

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

有没有人知道任何有用的文章,或有任何这方面的经验?

回答

1

我开始着手创建一个带有TextReader的私有Filter子类(基本上在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>