如何在MSBuild 4中按多个字符拆分字符串?
我有一个名为如何在MSBuild 4中按多个字符拆分字符串?,msbuild,msbuild-4.0,Msbuild,Msbuild 4.0,我有一个名为MasterVersion的字符串: 1.1-SNAPSHOT 我需要把它分成两份。因此它变成了一个名为SplitVersion的string[]数组,即: 1 1 SNAPSHOT 我已经尝试了我能想到的一切,包括以下十几种变体,但毫无乐趣: <!-- doesn't work --> <ItemGroup> <VersionDelimiters Include="." /> <VersionDelimiters Inc
MasterVersion
的字符串:
1.1-SNAPSHOT
我需要把它分成两份。因此它变成了一个名为SplitVersion
的string[]
数组,即:
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语法?也许吧
<ItemGroup>
<SplitVersion Include="$(MasterVersion.Split('.','-'))" />
</ItemGroup>
(MSBuild应自动将其转换为数组)如果在ItemGroup中使用此表达式,ItemGroup用于收集生成所需的构件。我想你在找一个地产集团 像这样的
<PropertyGroup>
<MasterVersion>1.1-SNAPSHOT</MasterVersion>
<SplitVersion Include="$(MasterVersion.Split(`.`,`-`)" />
</PropertyGroup>
1.1-快照
您应该记住,在MSBuild中使用$(美元符号)引用属性。使用@(at符号)引用项目
根据MasterVersion组的不同,您必须将$to@MSBuild 4.0属性函数更改为不能处理数组(基本上是这样),但是当您执行
Split(`,`, `-`)
您正在调用String.Split(params String[])
重载,该重载需要一个数组(即使在C#中,params
关键字也会在场景后面创建一个数组,并在内部执行类似Split(新字符串[]{',','-})
的操作)
您可以执行以下操作:
<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>
数组索引操作符在这里工作,因为在本例中,您仍然处于.NET表达式的“上下文”中。一旦分配给属性(或项目组),您就不能再这样做了。这不会解析,因为属性上不能有
Include
属性。是的,这是正确的,当像$(MasterVersion.Split('.','-')一样使用它时,它应该可以工作。不,它不会。首先,它缺少一个结束符',其次,请参阅我关于阵列支持的回答。错误MSB4184:无法计算表达式“1.1-SNAPSHOT”.Split(,-)”。输入字符串的格式不正确。
完成此操作后,SplitVersion
的内容是什么?它大概是一个ITaskItem
数组吗?我如何单独访问这些值,比如通过索引?
<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>
<PropertyGroup>
<SplitVersion0>$(MasterVersion.Split($(DelimitersArray))[0])</SplitVersion0>
<SplitVersion1>$(MasterVersion.Split($(DelimitersArray))[1])</SplitVersion1>
<SplitVersion2>$(MasterVersion.Split($(DelimitersArray))[2])</SplitVersion2>
</PropertyGroup>