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

Posted

技术标签:

【中文标题】为啥 Msbuild 任务无法部署数据库,但 Exec 工作正常【英文标题】:Why Msbuild task failed to deploy database, but Exec work fine为什么 Msbuild 任务无法部署数据库,但 Exec 工作正常 【发布时间】:2012-03-31 19:05:52 【问题描述】:

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

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

<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 脚本中调用 msbuild.exe 只会伤害我内心的完美主义者。

【问题讨论】:

【参考方案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" />

【讨论】:

以上是关于为啥 Msbuild 任务无法部署数据库,但 Exec 工作正常的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CruiseControl.NET 无法构建,但使用命令行中的 msbuild.exe 有效?

无法让 MSBuild 社区任务 RegexReplace 工作

msbuild 错误 MSB3191:在远程服务器中发布时无法创建目录

为啥我无法使用项目解决方案文件在 Msbuild Teamcity 中构建测试项目?

MSBuild + Bamboo 部署:构建一次并进行多次部署?

MSBuild 还原给出“请求被中止:无法创建 SSL/TLS 安全通道。”