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

Ian*_*emp 10 msbuild msbuild-4.0

我有以下字符串MasterVersion:

1.1-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

我需要把它分开.和 - 所以它成为一个string[]叫做的数组SplitVersion,即:

1
1
SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Chr*_*n.K 14

MSBuild 4.0属性函数无法处理数组(基本上很好),但是当你这样做时

Split(`,`, `-`)
Run Code Online (Sandbox Code Playgroud)

你正在调用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>
Run Code Online (Sandbox Code Playgroud)

或者您可以先创建要传递给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>
Run Code Online (Sandbox Code Playgroud)

在这种情况下哪个不是更好;-)

哦,您可能需要查看此MSDN博客,了解更多有用的信息.

更新评论:

  • 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>
Run Code Online (Sandbox Code Playgroud)

数组索引操作符在这里工作,因为在这种情况下,您仍然处于.NET表达式的"上下文"中.一旦将其分配给属性(或项目组),您就不能再这样做了.