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[] внутри пользовательской задачи.

3 ответа

Решение

AFAICS, вы можете использовать точку с запятой в свойстве $(ConnectionString), например:

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

Или используйте какое-нибудь задание, чтобы заменить ';' в свойстве ConnectionString для "%3B", а затем используйте это свойство в элементе InstallShieldProperties.

Другой способ может состоять в том, чтобы изменить тип свойства в пользовательской задаче со строки [] на строку, а затем разбить его самостоятельно, так, как вы этого хотите. Вы можете использовать заключающие в кавычки, чтобы отделить часть строки соединения от других пар ключ / значение.

Или, если это имеет смысл для вашей пользовательской задачи, то, возможно, строка подключения является достаточно специальным свойством, чтобы иметь в качестве отдельного свойства задачи.

В MSBuild 4.0 вы можете использовать $([MSBuild]::Escape($(ConnectionString))),

В MSBuild 4.0 теперь есть функции свойств. Это позволяет вам вызывать методы экземпляра.NET String непосредственно в ваших свойствах, как будто они являются строками (какими они являются).

В вашем примере вместо использования:

$(ConnectionString)

Вы можете использовать:

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

Который будет вызывать метод String Replace() для замены точек с запятой на%3B

Другие вопросы по тегам