2012-01-16 28 views
10

Tôi có chuỗi sau đây gọi là MasterVersion:Làm thế nào để chia chuỗi bằng nhiều ký tự trong MSBuild 4?

1.1-SNAPSHOT 

tôi cần phải chia nó bằng. và - vì vậy nó trở thành một mảng string[] gọi SplitVersion, ví dụ:

1 
1 
SNAPSHOT 

Tôi đã thử tất cả mọi thứ tôi có thể nghĩ đến trong đó có khoảng một chục biến thể của các bên dưới, không có niềm vui:

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

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

Cú pháp MSBuild tối nghĩa nào tôi bị mất/mút lên?

Trả lời

12

MSBuild 4,0 chức năng bất động sản không thể xử lý mảng (cũng cơ bản), tuy nhiên khi bạn làm một

Split(`,`, `-`) 

Bạn đang gọi sự quá tải String.Split(params string[]), đòi hỏi một mảng (ngay cả trong C# params từ khóa sẽ tạo ra một mảng đằng sau hiện trường và làm một cái gì đó như Split(new string[] { ',', '-' }) nội bộ).

gì bạn có thể làm như sau:

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

Hoặc đầu tiên bạn có thể tạo ra (string) mảng để được thông qua đến 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> 

Mà không phải là thực sự tốt hơn trong trường hợp này ;-)

Ồ, và bạn có thể muốn xem this MSDN blog entr y để biết thêm thông tin hữu ích.

1

lẽ

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

(MSBuild nên tự động chuyển đổi này để mảng)

+0

Cung cấp lỗi. –

+0

lỗi là gì? –

+0

'lỗi MSB4184: Biểu thức" "1.1-SNAPSHOT" .Split (., -) "không thể được đánh giá. Chuỗi đầu vào không đúng định dạng.' –

-1

Bạn đang sử dụng biểu thức này trong một ItemGroup, ItemGroups được sử dụng để thu thập hiện vật cần thiết cho việc xây dựng. Tôi nghĩ rằng bạn đang tìm kiếm một PropertyGroup

Something như thế này

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

Bạn nên nhớ rằng Thuộc tính được tham chiếu trong MSBuild sử dụng $ (Dollar Sign). Các mục được tham chiếu bằng cách sử dụng @ (tại dấu).

Tùy thuộc vào nhóm MasterVersion, bạn phải thay đổi $ để @

+0

Điều đó không phân tích cú pháp vì bạn không thể có thuộc tính 'Bao gồm' trên thuộc tính. –

+0

Đúng vậy, nó sẽ hoạt động khi sử dụng nó như $ (MasterVersioin.Split ('.', '-')

+0

Không có. Trước hết nó thiếu một ')' , thứ hai nhìn thấy câu trả lời của tôi về hỗ trợ mảng. –

Các vấn đề liên quan