MSBuild 4.0属性函数不能很好地处理数组,但当你执行
Split(`,`, `-`)
您正在调用 String.Split(params string[])
这个重载方法,它需要一个数组作为参数(即使在C#中使用params
关键字也会在幕后创建一个数组并类似于Split(new string[] { ',', '-' })
这样的操作)。
您可以尝试以下方式:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0">
<PropertyGroup>
<MasterVersion>1.1-SNAPSHOT</MasterVersion>
</PropertyGroup>
<ItemGroup>
<SplitVersion Include="$(MasterVersion.Replace(`-`, `.`).Split(`.`))" />
</ItemGroup>
<Target Name="Test">
<Message Importance="high" Text="@(SplitVersion)"/>
</Target>
</Project>
或者您可以先创建要传递给 Split 的(字符串)数组:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<MasterVersion>1.1-SNAPSHOT</MasterVersion>
<Delimiters>.;-</Delimiters>
<DelimitersArray>$(Delimiters.Split(`;`))</DelimitersArray>
</PropertyGroup>
<ItemGroup>
<SplitVersion Include="$(MasterVersion.Split($(DelimitersArray)))" />
</ItemGroup>
<Target Name="Test">
<Message Importance="high" Text="@(SplitVersion)"/>
</Target>
</Project>
在这种情况下,这并不是真的更好;-)
哦,你可能想查看这篇MSDN博客以获取更多有用信息。
更新一条评论:
SplitVersion
的“内容”在技术上是一个“ITaskItem数组”,是的。
您将处理它与处理项目(项目组中的项目)的方式相同;
包括诸如“批处理”等内容。
您无法在msbuild项目文件中真正地“按索引访问”内容。像$(SplitVersion)[0]
、@(SplitVersion)[0]
或@(SplitVersion[0])
这样的表达式
不能做你认为/希望的事情。如果你真的想要,你可以通过“索引”为“数组元素”分配单独的属性。
示例:
<PropertyGroup>
<SplitVersion0>$(MasterVersion.Split($(DelimitersArray))[0])</SplitVersion0>
<SplitVersion1>$(MasterVersion.Split($(DelimitersArray))[1])</SplitVersion1>
<SplitVersion2>$(MasterVersion.Split($(DelimitersArray))[2])</SplitVersion2>
</PropertyGroup>
在这种情况下,数组索引操作符起作用,因为此时您仍处于.NET表达式的“上下文”中。一旦将其分配给属性(或项组),就不能再这样做了。
SplitVersion
的内容是什么?它应该是一个ITaskItem
数组,对吗?我如何逐个访问这些值,比如按索引? - Neil Barnwell