Почему задаче Msbuild не удалось развернуть базу данных, но Exec работает нормально - PullRequest
5 голосов
/ 31 марта 2012

Я пытаюсь развернуть проект базы данных (формат 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>

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

Имя "Integrated Security" содержит недопустимый символ "" .

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

ошибка MSB4018: задача «SqlDeployTask» неожиданно завершилась неудачей.

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

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

1 Ответ

4 голосов
/ 03 апреля 2012

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

<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" />
...