2009-11-03 32 views
8

Khi một thuộc tính đơn chứa dấu chấm phẩy, MSBuild tự động phân tích thuộc tính thành danh sách thuộc tính khi được sử dụng trong một nhóm mục. Dưới đây là một đoạn trích từ dự án của tôi:MSBuild: cách kiểm soát việc phân tích cú pháp của thuộc tính được phân cách bằng dấu chấm phẩy

<PropertyGroup> 
    <ConnectionString>workstation id=.;packet size=4096;Integrated Security=SSPI;data source=.;initial catalog=$(SqlDbName)</ConnectionString> 
</PropertyGroup> 

<ItemGroup> 
    <InstallShieldProperties Include=" 
     CONNECTIONSTRING=$(ConnectionString); 
     Another=$(value)"/> 
</ItemGroup> 

Khi một nhiệm vụ tiêu thụ các @ (InstallShieldProperties) ItemGroup, MSBuild sẽ phân tích thuộc tính ConnectionString vào một danh sách các thuộc tính tập hợp con vì nó chứa dấu chấm phẩy.

foreach (string property in Properties) 
    { 
     // Properties array parsed to pieces 
    } 

Tôi biết tôi có thể thay đổi dấu phân cách của nhóm mặt hàng, nhưng điều đó sẽ không tạo ra bất kỳ sự khác biệt nào. Tôi đang cố gắng tránh thao tác chuỗi chuỗi [] trong tác vụ tùy chỉnh.

Trả lời

9

AFAICS, bạn có thể thoát khỏi dấu chấm phẩy trong $ (ConnectionString) bất động sản như:

<ConnectionString>workstation id=.%3Bpacket size=4096%3B.."</ConnectionString> 

Hoặc sử dụng một số nhiệm vụ để thay thế ';' trong thuộc tính ConnectionString đến '% 3B' và sau đó sử dụng thuộc tính đó trong mục InstallShieldProperties.

Cách khác có thể là thay đổi loại thuộc tính trong tác vụ tùy chỉnh từ chuỗi [] thành chuỗi và sau đó chia tách nó theo cách bạn muốn. Bạn có thể sử dụng dấu ngoặc kèm theo để tách riêng phần chuỗi kết nối khỏi các cặp khóa/giá trị khác.

Hoặc nếu điều đó có ý nghĩa đối với tác vụ tùy chỉnh của bạn, thì có thể chuỗi kết nối là thuộc tính đủ đặc biệt để có thuộc tính tác vụ riêng biệt.

8

Trong MSBuild 4.0, hiện có Property Functions. Một điều cho phép bạn làm là gọi các phương thức .NET String trực tiếp trên các thuộc tính của bạn như thể chúng là các chuỗi (chúng là các chuỗi).

Trong ví dụ của bạn, thay vì sử dụng:

$(ConnectionString) 

Bạn có thể sử dụng:

$(ConnectionString.Replace(';', '%3B')) 

Mà sẽ gọi phương thức Chuỗi Replace() để thay thế dấu chấm phẩy với% 3B

9

Trong MSBuild 4.0, bạn có thể sử dụng $([MSBuild]::Escape($(ConnectionString))).

+1

Rất hữu ích! Và [đây là một liên kết đến tài liệu hàm tài sản] (http://msdn.microsoft.com/en-us/library/dd633440.aspx). –

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