Почему задаче Msbuild не удалось развернуть базу данных, но Exec работает нормально

Я пытаюсь развернуть проект базы данных (формат dbproj, а не новый SSDT sqlproj) внутри автоматизированной обработки сервера сборки. Я нашел следующее:

Когда я вызываю развертывание с задачей Exec в своем сценарии Msbuild, все работает нормально:

<Exec Command="$(MSBuildPath)\MSBuild.exe $(SourceFilesPath)\$(DeployDatabaseProjectName)\$(DeployDatabaseProjectName).dbproj 
/t:Deploy 
/p:OutputPath=$(BaseOutput)\$(DeployDatabaseProjectName)\ 
/p:TargetDatabase=$(DeployDatabaseName)
/p:TargetConnectionString=$(DeployDatabaseConnectionString)" />

Но когда я пытаюсь повторить это с задачей Msbuild, она ведет себя по-другому:

<MSBuild Projects="$(SourceFilesPath)\$(DeployDatabaseProjectName)\$(DeployDatabaseProjectName).dbproj" 
            Targets="Deploy"
            Properties="Configuration=$(BuildConfiguration);
            TargetDatabase=$(DeployDatabaseName);
            TargetConnectionString=&quot;$(DeployDatabaseConnectionString)&quot;;
            OutputPath=$(BaseOutput)\$(DeployDatabaseProjectName)\;
            " />

Задача Msbuild сломалась из-за точки с запятой в DeployDatabaseConnectionString:

<DeployDatabaseConnectionString>Data Source=$(DeployDatabaseServer);Integrated Security=True;Pooling=False</DeployDatabaseConnectionString>

Он сообщит что-то вроде этого:

Название "Встроенная безопасность" содержит недопустимый символ " ".

Но если я заменю точки с запятой на процентное значение кодировки — %3B — он сломается внутри SqlDeployTask:

ошибка MSB4018: Неожиданный сбой задачи "SqlDeployTask".

Как правильно передать TargetConnectionString для развертывания цели SqlProject?

PS: я мог бы жить с задачей exec, но вызов msbuild.exe внутри сценария msbuild просто ранит моего внутреннего перфекциониста.


person Alexey Shcherbak    schedule 31.03.2012    source источник


Ответы (1)


Я нашел правильный способ - новый Msbuild позволяет определять метаданные AdditionalProperties для элемента. Так что с этой фичей все работает нормально и проблем с экранированием\кодированием нет.

<ItemGroup>
    <DbProjectToBuild Include="$(SourceFilesPath)\$(DeployDatabaseProjectName)\$(DeployDatabaseProjectName).dbproj">
        <AdditionalProperties>Configuration=$(BuildConfiguration)</AdditionalProperties>
        <AdditionalProperties>OutputPath=$(BaseOutput)\$(DeployDatabaseProjectName)\</AdditionalProperties>
        <AdditionalProperties>TargetDatabase=$(DeployDatabaseName)</AdditionalProperties>
        <AdditionalProperties>TargetConnectionString="Data Source=$(DeployDatabaseServer);Integrated Security=True;Pooling=False"</AdditionalProperties>
    </DbProjectToBuild>
</ItemGroup>        
<MSBuild Projects="%(DbProjectToBuild.Identity)" Targets="Build;Deploy" />
person Alexey Shcherbak    schedule 03.04.2012