如何将数据传递给MSBuild任务的ITaskItem属性?

时间:2009-03-24 00:35:36

标签: .net msbuild itaskitem

我有一个自定义任务,我在 MSBuild 中使用。效果很好。 以前,我有一些属性接受了一些string数据。有人建议我将它们改为ITaskItem。这样,如果我有空格,我不应该有问题。

以前的代码

public class CompressorTask : Task
    {
    ....
    public string CssFiles { get; set; }
    public string JavaScriptFiles { get; set; }
}

示例msbuild文件(例如,MsBuildSample.xml)...

<CompressorTask
    CssFiles="StylesheetSample1.css, StylesheetSample2.css, 
              StylesheetSample3.css, StylesheetSample4.css"
    JavaScriptFiles="jquery-1.2.6-vsdoc.js"
... />

注意我有4个css文件?我通过空间分隔符手动提取它们。 KEWL。

新代码

 public ITaskItem[] CssFiles { get; set; }
 public ITaskItem[] JavaScriptFiles { get; set; }

现在,我不确定我需要在MSBuild文件的CssFiles属性中设置什么值。

有什么建议吗?

2 个答案:

答案 0 :(得分:7)

我认为您现在需要将文件放入具有属性名称的项目列表中:

<ItemGroup>
    <CssFiles Include="StylesheetSample1.css"/>
    <CssFiles Include="StylesheetSample2.css"/>
    <CssFiles Include="StylesheetSample3.css"/>
    <CssFiles Include="StylesheetSample4.css"/>
    <!-- or <CssFiles Include="*.css" /> -->
    <JavaScriptFiles Include="jquery-1.2.6-vsdoc.js"/>
</ItemGroup>
<CompressorTask CssFiles="@(CssFiles)" JavaScriptFiles="@(JavaScriptFiles)"/>

答案 1 :(得分:3)

这实际上更容易,只需使用字符串数组。在指定值时,使用单个值,以分号分隔的列表(如果您愿意,使用空格)或ItemGroup(例如@(someItemGroup)),MSBuild足够聪明,可以为您解决这个问题:

<CompressorTask
    CssFiles="StylesheetSample1.css; StylesheetSample2.css;
              StylesheetSample3.css; StylesheetSample4.css"
    JavaScriptFiles="jquery-1.2.6-vsdoc.js"
... />

MSBuild任务来源:

public string[] CssFiles { get; set; }
public string[] JavaScriptFiles { get; set; }