2009-11-03 15 views
8

Gdy pojedyncza właściwość zawiera średniki, MSBuild automatycznie analizuje właściwość na listę właściwości, gdy jest używana w grupie produktów. Oto urywek z mojego projektu:MSBuild: jak kontrolować parsowanie wartości rozdzielanej średnikami

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

Gdy zadanie konsumuje @ (InstallShieldProperties) ItemGroup, MSBuild będzie analizować właściwość ConnectionString do listy właściwości podzbioru ponieważ zawiera średników.

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

Wiem, że mogę zmienić ogranicznik grupy item, ale to nie ma znaczenia. Próbuję uniknąć manipulowania tablicą ciągów znaków [] w niestandardowym zadaniu.

Odpowiedz

9

AFAICS, można uciec średnik w $ (ConnectionString) nieruchomości jak:

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

Albo użyć jakieś zadanie zastąpić ';' w właściwości ConnectionString do '% 3B', a następnie użyj tej właściwości w elemencie InstallShieldProperties.

Innym sposobem może być zmiana typu właściwości w niestandardowym zadaniu z ciągu znaków [] na ciąg znaków, a następnie podzielenie go w taki sposób, jaki chcesz. Można użyć obstawiających cytatów, aby oddzielić część Ciąg połączenia od innych par klucz/wartość.

Lub jeśli ma to sens w przypadku niestandardowego zadania, to być może ciąg połączenia jest wystarczająco specjalną właściwością, aby mieć oddzielną właściwość zadania.

8

W programie MSBuild 4.0 jest teraz Property Functions. Jedną z rzeczy, które pozwalają ci na to, to wywoływanie metod instancji .NET String bezpośrednio na twoich właściwościach, tak jakby były łańcuchami (które są).

W przykładzie, zamiast używać:

$(ConnectionString) 

Można użyć:

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

Który będzie wywołać metodę String Replace(), aby zastąpić średników z% 3B

9

W MSBuild 4.0, możesz użyć $([MSBuild]::Escape($(ConnectionString))).

+1

Bardzo przydatne! I [tutaj jest link do dokumentacji funkcji nieruchomości] (http://msdn.microsoft.com/en-us/library/dd633440.aspx). –