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>
或者您可以首先创建要传递给拆分的(字符串)数组:
<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 数组”,是的。你会处理它,但是你会处理(ItemGroups的)项目;包括诸如“批处理”之类的东西。
您不能在 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 表达式的“上下文”中。一旦将其分配给属性(或项目组),您就不能再这样做了。