2012-03-31 11 views
5

Estoy intentando implementar el proyecto de base de datos (formato dbproj, no el nuevo SSDT sqlproj) dentro del procesamiento automatizado del servidor de compilación. He encontrado el siguiente:Por qué la tarea de Msbuild no pudo implementar la base de datos, pero Exec funciona bien

Cuando estoy llamando a desplegar con tarea Exec en mi guión MSBUILD - todo funciona bien:

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

Pero cuando trato de repetir esta tarea con MSBUILD - se comporta de manera diferente:

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

tarea MSBUILD se rompió en un punto y coma en DeployDatabaseConnectionString:

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

Se informará algo como esto:

El nombre de "seguridad integrada" contiene un carácter no válido "".

Pero si reemplazo punto y coma con valor porcentual de codificación -% 3B - se rompió dentro SqlDeployTask:

error MSB4018: La tarea "SqlDeployTask" error inesperado.

¿Cuál es la forma correcta de pasar TargetConnectionString para implementar el objetivo de SqlProject?

PD: Puedo vivir bien con la tarea ejecutiva, pero hacer una llamada a msbuild.exe dentro de la secuencia de comandos de msbuild solo lastima a mi hombre perfeccionista interno.

Respuesta

4

Encontré la manera correcta - nuevo Msbuild permite definir metadatos AdditionalProperties en el artículo. Por lo tanto, con esta característica todo funciona bien y no tiene problemas con escaping \ encoding

<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" /> 
Cuestiones relacionadas