我有以下名为MasterVersion
的字符串:
1.1-SNAPSHOT
我需要把它分开。和 - 所以它变成一个名为string[]
的{{1}}数组,即:
SplitVersion
我已经尝试了我能想到的所有内容,包括下面的十几种变体,没有任何乐趣:
1
1
SNAPSHOT
我错过了什么模糊的MSBuild语法/错误?
答案 0 :(得分:13)
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>
在这种情况下哪个不是更好; - )
哦,您可能想查看this MSDN blog entr y以获取更多有用的信息。
更新以发表评论:
SplitVersion
的“内容”在技术上是“ITaskItem数组”,是的。
你会处理它,但你会处理Items(of ItemGroups);
包括“批处理”等内容。
您无法在msbuild项目文件中真正“按索引访问”。表达式如
$(SplitVersion)[0]
或@(SplitVersion)[0]
或@(SplitVersion[0])
没有
做你想的/喜欢的。如果你真的愿意,你可以分配个人
“index”的“数组元素”的属性。
示例:
<PropertyGroup>
<SplitVersion0>$(MasterVersion.Split($(DelimitersArray))[0])</SplitVersion0>
<SplitVersion1>$(MasterVersion.Split($(DelimitersArray))[1])</SplitVersion1>
<SplitVersion2>$(MasterVersion.Split($(DelimitersArray))[2])</SplitVersion2>
</PropertyGroup>
数组索引操作符在这里工作,因为在这种情况下,您仍然处于.NET表达式的“上下文”中。一旦将其分配给属性(或项目组),您就不能再这样做了。
答案 1 :(得分:0)
也许
<ItemGroup>
<SplitVersion Include="$(MasterVersion.Split('.','-'))" />
</ItemGroup>
(MSBuild应该将其自动转换为数组)
答案 2 :(得分:-1)
您在ItemGroup中使用此表达式,ItemGroups用于收集构建所需的工件。我想你正在寻找一个PropertyGroup
像这样的东西
<PropertyGroup>
<MasterVersion>1.1-SNAPSHOT</MasterVersion>
<SplitVersion Include="$(MasterVersion.Split(`.`,`-`)" />
</PropertyGroup>
您应该记住使用$(美元符号)在MSBuild中引用属性。使用@(at Sign)引用项目。
根据MasterVersion组,您必须将$更改为@