如何在MSBuild 4中按多个字符拆分字符串?

时间:2012-01-16 15:10:22

标签: msbuild msbuild-4.0

我有以下名为MasterVersion的字符串:

1.1-SNAPSHOT

我需要把它分开。和 - 所以它变成一个名为string[]的{​​{1}}数组,即:

SplitVersion

我已经尝试了我能想到的所有内容,包括下面的十几种变体,没有任何乐趣:

1
1
SNAPSHOT

我错过了什么模糊的MSBuild语法/错误?

3 个答案:

答案 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组,您必须将$更改为@