我已在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)?
答案 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>