MSBuild自定义任务,带有变量no输入参数

时间:2011-10-09 15:36:18

标签: c# msbuild task

我已在MSBuild中完成了几项自定义任务,但我在这里遇到了新情况。

简而言之,我想这样做:

<Target Name="MyTarget">
  <CustomTask Files="">
     <Input Name="SomeName" Action="SomeActionName />
     <Input Name="SomeName" Action="SomeActionName />
     <Input Name="SomeName" Action="SomeActionName />
  </CustomTask>
</Target>

我想这样做,因为我发现它比使用Itemgroups / propertygroups更具可读性。 有一个属性,如输出,这几乎是我需要的。它应该只是输入(因此名称)。

到目前为止,我尝试使用两个任务解决此问题:CustomTask和InputTask。

请注意,输入不必是任务。这只是一个测试和获取可变大小的输入集合的方法。

public class CustomTask : Task
{
    [Required]
    public TaskItem[] Files { get; set; }

    public InputTask[] Subs { get; set; }

    public override bool Execute()
    {
        if(Subs != null)
        {
            Subs.ToList().ForEach(sub => sub.Execute());
        }
        else
        {
            Log.LogMessage("No Subs");
        }
        return true;
    }
}

public class InputTask: Task
{
    [Required]
    public TaskItem Name{ get; set; }

    [Required]
    public TaskItem Action{ get; set; }

    public override bool Execute()
    {
        Log.LogMessage("" + Name + " should " + Action);
        return true;
    }
}

这个想法是MBSuild可以“检测”子任务,然后交给我一个集合,但我只是得到一个MSB4067错误。

我已经浏览了很多在线操作系统任务和官方文档,但我没有找到任何这样的例子。

甚至可以这样做吗?

如果没有,你会如何推荐我解决这个问题(PropertyGroup / ItemGroup / Other)?

1 个答案:

答案 0 :(得分:3)

你想做的事是不可能的。您可以使用项目元数据对其进行近似。

<Target Name="MyTarget"> 

   <ItemGroup>
      <Input Identity="SomeName"><Action>SomeActionName</Action></Input>
      <Input Identity="SomeName"><Action>SomeActionName</Action></Input> 
      <Input Identity="SomeName"><Action>SomeActionName</Action></Input>
   </ItemGroup>

   <CustomTask Files="" Input="@(Input)"> 

</Target>