2012-03-31 9 views
5

Sto provando a distribuire il progetto di database (formato dbproj, non nuovo SSDT sqlproj) all'interno dell'elaborazione del server di build automatizzato. Ho trovato il seguente:Perché l'attività di Msbuild non è riuscita a distribuire il database, ma Exec funziona correttamente

Quando sto chiamando distribuire con compito Exec nel mio script MSBuild - tutto funziona bene:

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

Ma quando provo a ripetere questo con compito MSBuild - si comporta in modo diverso:

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

compito MSBuild rotto il punto e virgola in DeployDatabaseConnectionString:

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

Riporterà qualcosa del genere:

Il nome "Sicurezza integrata" contiene un carattere non valido "".

Ma se sostituisco il punto e virgola con valore di codifica per cento -% 3B - sarà rotto all'interno SqlDeployTask:

errore MSB4018: Il compito "SqlDeployTask" falliti inaspettatamente.

Qual è il modo corretto per passare TargetConnectionString a Deploy target di SqlProject?

PS: I Potrebbe vivere bene con il compito di exec, ma effettuare una chiamata a msbuild.exe all'interno dello script di msbuild mi fa solo male al perfezionista interiore.

risposta

4

Ho trovato il modo corretto: nuovo Msbuild consente di definire i metadati AdditionalProperties sull'elemento. Quindi con questa funzione tutto funziona bene e non ci sono problemi con l'escape \ 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" /> 
Problemi correlati