创建可以接受子xml元素或xml属性的Msbuild CustomTask(msbuild 3.5)

时间:2010-07-17 16:36:13

标签: .net .net-3.5 msbuild

我想创建一个以这样的方式调用的自定义任务:

 <Target Name="Remap">
     <ItemGroup>
         <Entry Key="key1" Value="value1" />
         <Entry Key="key2" Value="value2" />
     </ItemGroup>

     <CustomTask 
         Entries="@(Entry)"
     />
 </Target>

或者这个:

 <Target Name="Remap">
     <ItemGroup>
         <Entry>
             <Key>key1</Key>
             <Value>value1</Value>
         </Entry>
         <Entry>
             <Key>key2</Key>
             <Value>value2</Value>
         </Entry>
     </ItemGroup>

     <CustomTask 
         Entries="@(Entry)"
     />
 </Target>

我尝试过使用:

public class CustomTask : Task
{
    public override bool Execute()
    {
        ...
    }

    [Required]
    public ITaskItem[] Entries { get; set; }
}

但在第一种情况下,我收到错误:

error MSB4066: The attribute "Key" in element <Entry> is unrecognized.

在第二种情况下,虽然没有错误,但Entries集合只是空的。

有没有办法通过MsBuild自定义任务完成此任务?

1 个答案:

答案 0 :(得分:1)

项目组中的项目必须具有标识它的Include=属性,因此请尝试以下操作:

<Target Name="Remap">
     <ItemGroup>
         <Entry Include="key1">
             <Value>value1</Value>
         </Entry>
         <Entry Include="key2">
             <Value>value2</Value>
         </Entry>
     </ItemGroup>

     <CustomTask 
         Entries="@(Entry)"
     />
 </Target>

Value部分应在项目中显示为元数据。