如何阻止 MSBuild 发布多个数据库
How to stop MSBuild from publishing multiple databases
我有一个 visual studio 2017 解决方案,由 2 个 SSDT 项目组成 - 一个是我正在处理的主要项目,一个是包含主项目需要的链接对象的项目 "database reference"编译。
当我右键单击并发布主项目时,Visual Studio 正确地将主项目发布到目标服务器。
但是,当我 运行 在 CI 服务器 (TeamCity) 上执行 MSBuild 任务时,我可以看到 MSBUILD 正在尝试发布 referenced main 项目(这没有任何意义!)使用 publish.xml 项目(我不想要)。
如何让 MSBuild 只发布我关心的数据库?
命令行为:
msbuild.exe /t:Publish /p:SqlPublishProfilePath="MYDB.DROPANDCREATE.publish.xml"
MYDB.DROPANDCREATE.publish.xml 看起来像这样 - 它通过 SqlCmd 变量对引用的数据库执行 "allude"。但这肯定不足以让 MSBuild 决定发布它吗?
那么,让 msbuild 发布 MYDB 并停止尝试的正确命令行是什么
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>MYDB</TargetDatabaseName>
<DeployScriptFileName>MYDB.sql</DeployScriptFileName>
<TargetConnectionString>Data Source=MYSERVER;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True</TargetConnectionString>
<BlockOnPossibleDataLoss>False</BlockOnPossibleDataLoss>
<CreateNewDatabase>True</CreateNewDatabase>
<IncludeTransactionalScripts>True</IncludeTransactionalScripts>
<ProfileVersionNumber>1</ProfileVersionNumber>
<DeployDatabaseInSingleUserMode>True</DeployDatabaseInSingleUserMode>
</PropertyGroup>
<ItemGroup>
<SqlCmdVariable Include="ReferencedDbVariableName">
<Value>REFERENCEDDBNAME</Value>
</SqlCmdVariable>
<SqlCmdVariable Include="ReferecedServerVariableName">
<Value>REFERENCESERVERNAME</Value>
</SqlCmdVariable>
</ItemGroup>
</Project>
TeamCity 日志:
[13:42:00][步骤 2/2]MySln.sln.teamcity:构建目标:TeamCity_Generated_Build;发布(1m:05s)
[13:42:00][MySln.sln.teamcity] TeamCity_Generated_Build (1m:05s)
[13:42:01][TeamCity_Generated_Build] MSBuild (1m:04s)
[13:42:02][MSBuild] MySln.sln:构建目标:重建;发布 (1m:03s)
[13:42:02][MySln.sln] 验证解决方案配置
[13:42:02][MySln.sln]重建(49s)
[13:42:02][重建] MSBuild (49s)
[13:42:03][MSBuild] MyDb\MyDb.sqlproj:构建目标:重建(48 秒)
[13:42:52][MySln.sln] 发布(14 秒)
[13:42:52][发布] MSBuild (14s)
[13:42:52][MSBuild] MyDb\MyDb.sqlproj:生成目标:发布(13 秒)
[13:42:52][MyDb\MyDb.sqlproj] SqlPublish (13s)
[13:42:52][SqlPublish] SqlPublishTask (13s)
[13:43:03][SqlPublishTask] 部署脚本生成到:
C:\BuildAgent\workbba30477716a590\MyDb\bin\Release\MyDb.publish.sql
[13:43:03][SqlPublishTask] 正在创建 MYDB...
[13:43:06][SqlPublishTask] 数据库更新的事务处理部分成功。
[13:43:06][SqlPublishTask] 更新完成。
[13:43:06][MSBuild] ReferencedDb\ReferencedDb.sqlproj:生成目标:发布
[13:43:06][ReferencedDb\ReferencedDb.sqlproj] SqlPublish
[13:43:06][SqlPublish] SqlPublishTask
[13:43:06][SqlPublishTask] C:\BuildAgent\workbba30477716a590\ReferencedDb\bin\Release\ReferencedDb.publish.sql 错误 Deploy72002: 无法打开源文件 'C:\BuildAgent\workbba30477716a590\ReferencedDb\MYDB.DROPANDCREATE.publish.xml' ('The system cannot find the specified file. ') .
好的,我想我现在明白了...
C:\Users\x598144\source>msbuild .\MySln.SLN /p:S
qlPublishProfilePath="MYDB.DROPANDCREATE.publish.xml" /t:Publish
...尝试发布这两个数据库。而....
C:\Users\x598144\source>msbuild .\MyDb\MyDb.PROJ /p:S
qlPublishProfilePath="MYDB.DROPANDCREATE.publish.xml" /t:Publish
...只发布我关心的那个
我猜是因为我是在 TeamCity 中执行此操作的,所以我实际上并没有自己形成完整的命令行,所以我之前没有想到这一点。总之,现在一切都好!
我有一个 visual studio 2017 解决方案,由 2 个 SSDT 项目组成 - 一个是我正在处理的主要项目,一个是包含主项目需要的链接对象的项目 "database reference"编译。
当我右键单击并发布主项目时,Visual Studio 正确地将主项目发布到目标服务器。
但是,当我 运行 在 CI 服务器 (TeamCity) 上执行 MSBuild 任务时,我可以看到 MSBUILD 正在尝试发布 referenced main 项目(这没有任何意义!)使用 publish.xml 项目(我不想要)。
如何让 MSBuild 只发布我关心的数据库?
命令行为:
msbuild.exe /t:Publish /p:SqlPublishProfilePath="MYDB.DROPANDCREATE.publish.xml"
MYDB.DROPANDCREATE.publish.xml 看起来像这样 - 它通过 SqlCmd 变量对引用的数据库执行 "allude"。但这肯定不足以让 MSBuild 决定发布它吗?
那么,让 msbuild 发布 MYDB 并停止尝试的正确命令行是什么
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>MYDB</TargetDatabaseName>
<DeployScriptFileName>MYDB.sql</DeployScriptFileName>
<TargetConnectionString>Data Source=MYSERVER;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True</TargetConnectionString>
<BlockOnPossibleDataLoss>False</BlockOnPossibleDataLoss>
<CreateNewDatabase>True</CreateNewDatabase>
<IncludeTransactionalScripts>True</IncludeTransactionalScripts>
<ProfileVersionNumber>1</ProfileVersionNumber>
<DeployDatabaseInSingleUserMode>True</DeployDatabaseInSingleUserMode>
</PropertyGroup>
<ItemGroup>
<SqlCmdVariable Include="ReferencedDbVariableName">
<Value>REFERENCEDDBNAME</Value>
</SqlCmdVariable>
<SqlCmdVariable Include="ReferecedServerVariableName">
<Value>REFERENCESERVERNAME</Value>
</SqlCmdVariable>
</ItemGroup>
</Project>
TeamCity 日志:
[13:42:00][步骤 2/2]MySln.sln.teamcity:构建目标:TeamCity_Generated_Build;发布(1m:05s)
[13:42:00][MySln.sln.teamcity] TeamCity_Generated_Build (1m:05s)
[13:42:01][TeamCity_Generated_Build] MSBuild (1m:04s)
[13:42:02][MSBuild] MySln.sln:构建目标:重建;发布 (1m:03s)
[13:42:02][MySln.sln] 验证解决方案配置
[13:42:02][MySln.sln]重建(49s)
[13:42:02][重建] MSBuild (49s)
[13:42:03][MSBuild] MyDb\MyDb.sqlproj:构建目标:重建(48 秒)
[13:42:52][MySln.sln] 发布(14 秒)
[13:42:52][发布] MSBuild (14s)
[13:42:52][MSBuild] MyDb\MyDb.sqlproj:生成目标:发布(13 秒)
[13:42:52][MyDb\MyDb.sqlproj] SqlPublish (13s)
[13:42:52][SqlPublish] SqlPublishTask (13s)
[13:43:03][SqlPublishTask] 部署脚本生成到: C:\BuildAgent\workbba30477716a590\MyDb\bin\Release\MyDb.publish.sql
[13:43:03][SqlPublishTask] 正在创建 MYDB...
[13:43:06][SqlPublishTask] 数据库更新的事务处理部分成功。
[13:43:06][SqlPublishTask] 更新完成。
[13:43:06][MSBuild] ReferencedDb\ReferencedDb.sqlproj:生成目标:发布
[13:43:06][ReferencedDb\ReferencedDb.sqlproj] SqlPublish
[13:43:06][SqlPublish] SqlPublishTask
[13:43:06][SqlPublishTask] C:\BuildAgent\workbba30477716a590\ReferencedDb\bin\Release\ReferencedDb.publish.sql 错误 Deploy72002: 无法打开源文件 'C:\BuildAgent\workbba30477716a590\ReferencedDb\MYDB.DROPANDCREATE.publish.xml' ('The system cannot find the specified file. ') .
好的,我想我现在明白了...
C:\Users\x598144\source>msbuild .\MySln.SLN /p:S qlPublishProfilePath="MYDB.DROPANDCREATE.publish.xml" /t:Publish
...尝试发布这两个数据库。而....
C:\Users\x598144\source>msbuild .\MyDb\MyDb.PROJ /p:S qlPublishProfilePath="MYDB.DROPANDCREATE.publish.xml" /t:Publish
...只发布我关心的那个
我猜是因为我是在 TeamCity 中执行此操作的,所以我实际上并没有自己形成完整的命令行,所以我之前没有想到这一点。总之,现在一切都好!