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

发布于 2024-08-09 13:12:44 字数 728 浏览 3 评论 0原文

当单个属性包含分号时,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小傻瓜 2024-08-16 13:12:44

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

In MSBuild 4.0, you can use $([MSBuild]::Escape($(ConnectionString))).

池木 2024-08-16 13:12:44

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

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

或者使用某些任务来替换 ';'将 ConnectionString 属性中的值更改为“%3B”,然后在 InstallShieldProperties 项中使用该属性。

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

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

AFAICS, you can either escape the semicolon in the $(ConnectionString) property like:

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

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.

沉睡月亮 2024-08-16 13:12:44

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

: 代替使用

$(ConnectionString)

在您的示例中,您可以使用

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

:它将调用 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:

$(ConnectionString)

You could use:

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

Which will call the String method Replace() to replace semicolons with %3B

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文