我在 MSBuild 中完成了几个自定义任务,但我在这里面临着新的情况。
简而言之,我想这样做:
<Target Name="MyTarget">
<CustomTask Files="">
<Input Name="SomeName" Action="SomeActionName />
<Input Name="SomeName" Action="SomeActionName />
<Input Name="SomeName" Action="SomeActionName />
</CustomTask>
</Target>
我想这样做,因为我发现它比使用项目组/属性组更具可读性。 有一个诸如 Output 之类的属性几乎就是我所需要的。它应该只是输入(因此得名)。
到目前为止,我已尝试使用两个任务来解决此问题: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)?
最佳答案
你想做的事情是不可能的。您可以使用项目元数据来近似它。
<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>
关于c# - 具有可变输入参数数量的 MSBuild 自定义任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7704586/