如何阻止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
相关产品推荐
相关产品推荐

