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

3

我有一个自定义任务,我在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文件吗?我手动用逗号或空格分隔符提取它们。酷。

新代码

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

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

有什么建议吗?

2个回答

8
我认为你现在需要将文件放入一个名为属性的itemlist中:
<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)"/>

如果CSS文件名中有空格会发生什么? - Pure.Krome
+1. 就我个人而言,如果只有一个文件,为了方便使用,我会坚持使用字符串,并在可能存在多个文件时使用ITaskItem[]。 - si618

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; }

我过去常做那件事,但现在我已转向使用 ITaskItem。 - Pure.Krome

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接