如何在 CI 或从 msbuild 中构建具有不同目标平台的 SSDT 项目

How to build a SSDT project with different Target Platform in CI or from msbuild

VS 2019 中的 SSDT 项目有一个目标平台,它在进行构建时指定 bacpac 的目标数据库版本:

对于本地开发,这是正确的,但在持续交付设置中,我们希望以 Azure 数据库为目标,这是一个不同的选项。尝试发布为 SQL Server 2017 构建的 bacpac 文件会导致错误 A project which specifies SQL Server 2017 as the target platform cannot be published to Microsoft Azure SQL Database v12.

发生这种情况是因为,我认为,在 bacpac model.xml 文件中有行

<DataSchemaModel FileFormatVersion="1.2" SchemaVersion="2.9" DspName="Microsoft.Data.Tools.Schema.Sql.Sql140DatabaseSchemaProvider" CollationLcid="1033" CollationCaseSensitive="False" xmlns="http://schemas.microsoft.com/sqlserver/dac/Serialization/2012/02">

其中 DspName 指的是 SQL Server 2017。

是否有传递给 msbuild 的选项,这将导致它为不同的 Azure SQL 数据库目标构建 bacpac?

我尝试使用发布配置文件并在从 Azure 数据库创建 ci.publish.xml 时指定 /p:SqlPublishProfilePath="Ci.publish.xml",但这并不影响 bacpac 的创建。事实上,ci.publish.xml 文件仅包含数据库名称和连接字符串,与版本无关。

正如经常发生的那样,输入问题会让您思考,在 sqlproj 文件中您将看到 SQL Server 2017:

   <DSP>Microsoft.Data.Tools.Schema.Sql.Sql140DatabaseSchemaProvider</DSP>

对于 Azure SQL 数据库:

   <DSP>Microsoft.Data.Tools.Schema.Sql.SqlAzureV12DatabaseSchemaProvider</DSP>

所以将选项传递给 msbuild

msbuild /t:Build Db.sln /p:Configuration=Release /p:Platform="Any cpu" /p:DSP="Microsoft.Data.Tools.Schema.Sql.SqlAzureV12DatabaseSchemaProvider"

成功了。