如何阻止 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 中执行此操作的,所以我实际上并没有自己形成完整的命令行,所以我之前没有想到这一点。总之,现在一切都好!