You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止MSBuild发布多个数据库?VS2017 SSDT项目CI部署问题

解决MSBuild在TeamCity中误发布SSDT引用项目的问题

这种情况在SSDT项目的CI构建里挺常见的,核心问题是你直接针对解决方案执行Publish目标时,MSBuild会默认触发所有包含该目标的项目——包括那个只用来提供数据库引用的项目。这里有几个靠谱的解决办法:

1. 直接指定主项目文件而非解决方案执行Publish

这是最直接有效的方案,彻底避免MSBuild遍历解决方案里的所有项目。修改你的TeamCity MSBuild命令行:

msbuild.exe MyDb\MyDb.sqlproj /t:Publish /p:SqlPublishProfilePath="MYDB.DROPANDCREATE.publish.xml"

这样MSBuild只会专注处理主项目MyDb.sqlproj的Publish目标,完全不会触发引用项目的Publish操作。

2. 针对解决方案构建时,明确指定仅主项目执行Publish

如果你必须保留针对解决方案的构建流程,可以通过MSBuild参数精准控制Publish目标的执行范围:

msbuild.exe MySln.sln /t:Rebuild;MyDb:Publish /p:DeployOnBuild=false /p:SqlPublishProfilePath="MYDB.DROPANDCREATE.publish.xml"

这里的MyDb:Publish明确指定只执行主项目的Publish目标,同时DeployOnBuild=false全局禁用自动部署,防止引用项目被误触发。

3. 持久化禁用引用项目的Publish目标

如果不想每次都调整命令行,可以直接修改引用项目的ReferencedDb.sqlproj文件,在项目的<PropertyGroup>节点下添加配置:

<DeployOnBuild Condition=" '$(Configuration)' == 'Release' ">false</DeployOnBuild>

这样在CI常用的Release构建环境下,引用项目会自动跳过Publish操作,本地开发时也不会受影响。

结合你的日志分析

从TeamCity日志能看到,主项目MyDb已经成功发布完成,但MSBuild接着尝试发布ReferencedDb——用第一种方法就能立刻解决这个问题,因为直接指定主项目后,引用项目根本不会被纳入构建流程。

内容的提问来源于stack exchange,提问作者ubienewbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:29:53