2009-11-03 8 views
8

Quando una singola proprietà contiene il punto e virgola, MSBuild analizza automaticamente la proprietà in un elenco di proprietà quando viene utilizzata all'interno di un gruppo di articoli. Ecco un frammento dal mio progetto:MSBuild: come controllare l'analisi di una proprietà delimitata da punto e virgola

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

Quando un'attività consuma l'ItemGroup @ (InstallShieldProperties), MSBuild analizzerà la proprietà ConnectionString in un elenco di proprietà sottoinsieme poiché contiene un punto e virgola.

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

So che posso modificare il delimitatore del gruppo di articoli, ma ciò non farà alcuna differenza. Sto cercando di evitare di manipolare l'array string [] all'interno dell'attività personalizzata.

risposta

9

AFAICS, è possibile sfuggire il punto e virgola nel $ (ConnectionString) proprietà come:

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

o usare qualche compito di sostituire il ';' nella proprietà ConnectionString su '% 3B' e quindi utilizzare tale proprietà nell'elemento InstallShieldProperties.

L'altro modo potrebbe essere quello di modificare il tipo di proprietà nell'attività personalizzata da stringa [] a stringa e quindi dividerlo autonomamente, nel modo desiderato. È possibile utilizzare racchiudere le virgolette per separare la parte della stringa di connessione da altre coppie chiave/valore.

O se ha senso per l'attività personalizzata, allora forse la stringa di connessione è una proprietà abbastanza speciale da avere come proprietà di un'attività separata.

8

In MSBuild 4.0, ora ci sono Property Functions. Una cosa che ti permettono di fare è chiamare i metodi di istanza di .NET String direttamente sulle tue proprietà come se fossero stringhe (quali sono).

Nel tuo esempio, invece di utilizzare:

$(ConnectionString) 

si potrebbe usare:

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

che chiamerà il metodo String replace() per sostituire il punto e virgola con il% 3B

9

In MSBuild 4.0, è possibile utilizzare $([MSBuild]::Escape($(ConnectionString))).

+1

Molto utile! E [ecco un link alla documentazione delle funzioni di proprietà] (http://msdn.microsoft.com/en-us/library/dd633440.aspx). –