我正在尝试编写一个自定义 NAnt 任务来执行一些基于文件的操作。其中一件非常有用的事情是能够<expandproperties>
在其中一个输入文件上运行过滤器。
为了使任务保持适当的通用性,我只想启用对<filterchain>
元素的支持(类似于<copy>
任务的工作方式)。
我一直在使用<copy>
任务的源代码来指导我,但是在编写任务时我不断地遇到内部方法。我知道我可以使用反射来打破封装,但我不愿意这样做。
有没有人知道任何有用的文章,或者有这方面的经验?
我正在尝试编写一个自定义 NAnt 任务来执行一些基于文件的操作。其中一件非常有用的事情是能够<expandproperties>
在其中一个输入文件上运行过滤器。
为了使任务保持适当的通用性,我只想启用对<filterchain>
元素的支持(类似于<copy>
任务的工作方式)。
我一直在使用<copy>
任务的源代码来指导我,但是在编写任务时我不断地遇到内部方法。我知道我可以使用反射来打破封装,但我不愿意这样做。
有没有人知道任何有用的文章,或者有这方面的经验?
我开始创建一个私有过滤器子类,该子类采用 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>