为什么Msbuild任务无法部署数据库,但Exec工作正常

Ale*_*bak 5 deployment msbuild database-project

我正在尝试在自动构建服务器处理中部署数据库项目(dbproj格式,而不是新的SSDT sqlproj).我找到了以下内容:

当我在我的Msbuild脚本中使用Exec任务调用deploy时 - 一切正常:

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

但是当我尝试使用Msbuild任务重复此操作时 - 它的行为有所不同:

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

DeployDatabaseConnectionString中的分号破坏了Msbuild任务:

<DeployDatabaseConnectionString>Data Source=$(DeployDatabaseServer);Integrated Security=True;Pooling=False</DeployDatabaseConnectionString>
Run Code Online (Sandbox Code Playgroud)

它会报告这样的事情:

名称"Integrated Security"包含无效字符"".

但是如果我用百分比编码值 - %3B替换分号 - 它将在SqlDeployTask中破坏:

错误MSB4018:"SqlDeployTask"任务意外失败.

将TargetConnectionString传递给SqlProject的部署目标的正确方法是什么?

PS:我可以忍受exec任务很好,但是在msbuild脚本中调用msbuild.exe会伤害我内在的完美主义者.

Ale*_*bak 4

我找到了正确的方法 - 新的 Msbuild 允许在项目上定义附加属性元数据。因此,有了这个功能,一切都工作正常,并且没有转义\编码问题

<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" />
Run Code Online (Sandbox Code Playgroud)