2011-10-09 64 views
2

我已經做了幾個自定義任務MSBuild,但我在這裏面臨新的情況。MSBuild自定義任務與變量no輸入參數

總之,我想這樣做:

<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)?

回答

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> 
+0

是的,這絕對是我已經在帖子中提到的所有已經考慮的方式。我可能最終會這樣做,但希望有更多的讀者友好的方式來做到這一點。如果我找到一個好的選擇,我會回來。 –