2009-11-03 57 views
8

当单个属性包含分号时,在项目组内使用MSBuild时会自动将该属性解析为属性列表。下面是从我的项目的代码段:MSBuild:如何控制分号分隔属性的解析

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

当一个任务消耗@(InstallShieldProperties)的ItemGroup,会的MSBuild ConnectionString属性解析成子集属性的列表,因为它包含了分号。

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

我知道我可以更改itemgroup的分隔符,但这不会有任何区别。 我试图避免操作自定义任务内的字符串[]数组。

回答

9

AFAICS,您可以逃脱分号在$(的ConnectionString)属性,如:

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

或者使用一些任务来代替 ';'在ConnectionString属性中设置为'%3B',然后在InstallShieldProperties项目中使用该属性。

另一种方式可能是将自定义任务中的属性类型从字符串[]更改为字符串,然后自行将其拆分为所需的方式。您可以使用括号引号将连接字符串部分与其他键/值对分开。

或者,如果它对您的自定义任务有意义,那么连接字符串可能是一个足够特殊的属性,可以作为单独的任务属性使用。

8

在MSBuild 4.0中,现在有Property Functions。这些允许你做的一件事就是直接在你的属性上调用.NET String实例方法,就好像它们是字符串(它们是)。

在你的榜样,而不是使用:

$(ConnectionString) 

你可以使用:

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

,它将调用字符串replace()方法用%来代替分号3B

9

在MSBuild 4.0,您可以使用$([MSBuild]::Escape($(ConnectionString)))

+1

非常有用!并且[这里是链接到属性函数文档](http://msdn.microsoft.com/en-us/library/dd633440.aspx)。 – 2011-10-11 15:06:41