为啥 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="$(DeployDatabaseConnectionString)";
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 中构建测试项目?