Настраиваемая задача MSBuild с переменной no входных параметров - PullRequest
2 голосов
/ 09 октября 2011

Я выполнил несколько пользовательских задач в 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. Есть атрибут, такой как Output , который почти то, что мне нужно. Вместо него должно быть Input (отсюда и название).

До сих пор я пытался решить эту проблему, используя две задачи: 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 Ответ

3 голосов
/ 09 октября 2011

То, что вы пытаетесь сделать, невозможно.Вы можете аппроксимировать его метаданными элемента.

<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>
...