11

我有以下字符串MasterVersion

1.1-SNAPSHOT

我需要将其拆分为 . 和 - 所以它变成了一个string[]名为 的数组SplitVersion,即:

1
1
SNAPSHOT

我已经尝试了所有我能想到的方法,包括以下十几种变体,但没有任何乐趣:

<!-- doesn't work -->
<ItemGroup>
    <VersionDelimiters Include="." />
    <VersionDelimiters Include="-" />
    <SplitVersion Include="$(MasterVersion.Split(@VersionDelimiters))" />
</ItemGroup>

<!-- doesn't work either -->
<ItemGroup>
    <SplitVersion Include="$(MasterVersion.Split([`.`; `-`]))" />
</ItemGroup>

我错过/搞砸了什么晦涩难懂的 MSBuild 语法?

4

3 回答 3

16

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 表达式的“上下文”中。一旦将其分配给属性(或项目组),您就不能再这样做了。

于 2012-01-17T14:26:08.437 回答
0

也许

<ItemGroup>
    <SplitVersion Include="$(MasterVersion.Split('.','-'))" />
</ItemGroup>

(MSBuild 应该自动将其转换为数组)

于 2012-01-16T15:22:14.490 回答
-1

您在 ItemGroup 中使用此表达式,ItemGroups 用于收集构建所需的工件。我认为您正在寻找 PropertyGroup

像这样的东西

<PropertyGroup>
  <MasterVersion>1.1-SNAPSHOT</MasterVersion>
  <SplitVersion Include="$(MasterVersion.Split(`.`,`-`)" />
</PropertyGroup>

您应该记住,在 MSBuild 中使用 $(美元符号)引用属性。使用@(符号)引用项目。

根据 MasterVersion 的组,您必须将 $ 更改为 @

于 2012-01-16T20:25:19.770 回答