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