如何为自定义MSBuild任务分配值';s字符串[]属性,是否使用命令行?

如何为自定义MSBuild任务分配值';s字符串[]属性,是否使用命令行?,msbuild,Msbuild,我有一个自定义MSBuild任务(它扩展了Microsoft.Build.Utilities.task)。此任务的属性类型为string[]。任务本身(我们称之为“BobTask”)位于MSBuild文件中,该文件的值设置如下: <BobTask MyStringArrayProperty="@(MyStringArrayProperty)" /> 或 (是的,我知道上面的命令行示例不完整——这只是为了表明我的意图。) 但是,当我真正尝试此操作时,自定义任务中的MyStringAr

我有一个自定义MSBuild任务(它扩展了Microsoft.Build.Utilities.task)。此任务的属性类型为string[]。任务本身(我们称之为“BobTask”)位于MSBuild文件中,该文件的值设置如下:

<BobTask MyStringArrayProperty="@(MyStringArrayProperty)" />

(是的,我知道上面的命令行示例不完整——这只是为了表明我的意图。)

但是,当我真正尝试此操作时,自定义任务中的MyStringArrayProperty始终为空。我看到其他MSBuild任务使用字符串[]属性,因此这似乎是自定义任务的有效属性类型。这使我相信我在命令行上用于字符串列表的语法是不正确的。因此,是否有方法使用命令行为自定义MSBuild任务的string[]属性赋值?我需要使用一些特殊的语法吗

谢谢


-Craig

您在命令行上提供属性值,但向任务提供项目数组的内容;两者名称相同,但数据类型不同

要将属性转换为项目,请执行以下操作:

<ItemGroup>
    <MyStringArrayProperty Include="$(MyStringArrayProperty)" />
</ItemGroup>
<BobTask MyStringArrayProperty="@(MyStringArrayProperty)" /> 


摘自《技巧30:如何将属性转换为项目》一书

我将此作为一个答案,因为它让我走上了解决问题的正确道路。我所需要做的就是在我的MSBuild文件中将@(MyStringArrayProperty)更改为$(MyStringArrayProperty);不需要额外的ItemGroup。如果要将可枚举数组传递给任务,只需将MyStringGarrayProperty的数据类型设置为“ITaskItem[]”,并传入@(…)版本。如果将其保留为“string”类型,则必须自己对其进行解析,从而失去将元数据附加到数组元素的能力。
msbuild.exe file.proj /p:MyStringArrayProperty="value1;value2"
<ItemGroup>
    <MyStringArrayProperty Include="$(MyStringArrayProperty)" />
</ItemGroup>
<BobTask MyStringArrayProperty="@(MyStringArrayProperty)" />