MSBuild:如何控制分号分隔属性的解析

KMo*_*raz 8 msbuild msbuild-propertygroup

当单个属性包含分号时,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> 
Run Code Online (Sandbox Code Playgroud)

当任务使用@(InstallShieldProperties)项目组时,MSBuild会将ConnectionString属性解析为子集属性列表,因为它包含分号.

    foreach (string property in Properties)
    {
      // Properties array parsed to pieces
    }
Run Code Online (Sandbox Code Playgroud)

我知道我可以更改项目组的分隔符,但这不会有任何区别.我试图避免在自定义任务中操纵string []数组.

Ror*_*eod 10

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


rad*_*cal 9

AFAICS,您可以在$(ConnectionString)属性中转义分号,如:

<ConnectionString>workstation id=.%3Bpacket size=4096%3B.."</ConnectionString>
Run Code Online (Sandbox Code Playgroud)

或者使用一些任务来替换';' 在ConnectionString属性中为'%3B',然后在InstallShieldProperties项中使用该属性.

另一种方法是将自定义任务中的属性类型从string []更改为string,然后以您希望的方式自行拆分.您可以使用封闭引号将Connection字符串部分与其他键/值对分开.

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


Lan*_*her 9

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

在您的示例中,而不是使用:

$(ConnectionString)
Run Code Online (Sandbox Code Playgroud)

你可以使用:

$(ConnectionString.Replace(';', '%3B'))
Run Code Online (Sandbox Code Playgroud)

这将调用String方法Replace()以用%3B替换分号