2012-01-16 12 views
10

que tienen la siguiente cadena llama MasterVersion:Cómo dividir una cadena por varios caracteres en MSBuild 4?

1.1-SNAPSHOT 

tengo que dividirlo por el. y - por lo que se convierte en una matriz llamada string[]SplitVersion, es decir:

1 
1 
SNAPSHOT 

He intentado todo lo que puedo pensar en que incluye una docena de variaciones de los siguientes, sin alegría:

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

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

¿Qué sintaxis oscura de MSBuild me estoy perdiendo?

Respuesta

12

MSBuild 4.0 funciones de propiedad no pueden manejar matrices (así, básicamente), sin embargo cuando se hace una

Split(`,`, `-`) 

está invocando la sobrecarga String.Split(params string[]), que requiere una matriz (incluso en C#, la palabra clave params creará una matriz detrás de la escena y hará algo como Split(new string[] { ',', '-' }) internamente).

Lo que podría hacer es la siguiente:

<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> 

O bien, podría crear primero la (cadena) matriz que se pasa a 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> 

que no es realmente mejor en este caso ;-)

Ah, y es posible que desee comprobar this MSDN blog entr y para obtener más información útil.

1

Quizás

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

(MSBuild debe auto-convertir esto en matriz)

+0

Da un error. –

+0

¿cuál es el error? –

+0

'error MSB4184: La expresión" "1.1-SNAPSHOT" .Split (., -) "no se puede evaluar. La cadena de entrada no estaba en el formato correcto. –

-1

Estás usando esta expresión dentro de un ItemGroup, ItemGroups se utilizan para recoger los artefactos necesarios para la construcción. Creo que se está buscando un PropertyGroup

Algo como esto

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

Usted debe recordar que las propiedades están referenciados en MSBuild utilizando el $ (signo de dólar). Los elementos se referencian usando @ (en Sign).

Dependiendo del Grupo de MasterVersion, usted tiene que cambiar el $ a @

+0

No se analiza porque no se pueden tener atributos 'Include' en las propiedades. –

+0

Sí, eso es correcto, debería funcionar al usarlo como $ (MasterVersioin.Split ('.', '-')

+0

No, no. En primer lugar, falta un cierre ')' , en segundo lugar, vea mi respuesta sobre el soporte de matriz. –

Cuestiones relacionadas