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) 项组时,MSBuild 会将 ConnectionString 属性解析为子集属性列表,因为它包含分号。
foreach (string property in Properties)
{
// Properties array parsed to pieces
}
我知道我可以更改项目组的分隔符,但这不会有任何区别。 我试图避免在自定义任务中操作 string[] 数组。
When a single property contains semicolons, MSBuild automatically parse the property into a list of properties when used within an itemgroup. Here's a snippet from my project:
<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>
When a task consumes the @(InstallShieldProperties) itemgroup, MSBuild will parse the ConnectionString property into a list of subset properties since it contains semicolons.
foreach (string property in Properties)
{
// Properties array parsed to pieces
}
I know I can change the delimiter of the itemgroup, but that won't make any difference.
I'm trying to avoid manipulating the string[] array within the custom task.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 MSBuild 4.0 中,可以使用
$([MSBuild]::Escape($(ConnectionString)))
。In MSBuild 4.0, you can use
$([MSBuild]::Escape($(ConnectionString)))
.AFAICS,您可以转义 $(ConnectionString) 属性中的分号,例如:
或者使用某些任务来替换 ';'将 ConnectionString 属性中的值更改为“%3B”,然后在 InstallShieldProperties 项中使用该属性。
另一种方法可能是将自定义任务中的属性类型从 string[] 更改为 string,然后按照您想要的方式自行拆分。您可以使用引号将连接字符串部分与其他键/值对分开。
或者,如果它对您的自定义任务有意义,那么连接字符串可能是一个足够特殊的属性,可以作为单独的任务属性。
AFAICS, you can either escape the semicolon in the $(ConnectionString) property like:
Or use some task to replace the ';' in the ConnectionString property to '%3B' and then use that property in InstallShieldProperties item.
The other way could be to change the property type in the custom task from string[] to string, and then split it yourself, the way you want it. You could use enclosing quotes to separate Connection string part from other key/value pairs.
Or if it makes sense for your custom task, then maybe connection string is a special enough property to have as a separate task property.
在 MSBuild 4.0 中,现在有属性函数。这些允许您做的一件事是直接在您的属性上调用 .NET String 实例方法,就好像它们是字符串一样(它们确实是字符串)。
: 代替使用
在您的示例中,您可以使用
:它将调用 String 方法 Replace() 将分号替换为 %3B
In MSBuild 4.0, there are now Property Functions. One thing these allow you to do is call .NET String instance methods directly on your properties as if they are strings (which they are).
In your example, instead of using:
You could use:
Which will call the String method Replace() to replace semicolons with %3B