数据库项目部署 - 没有提供文件供参考 master.dacpac

Database projects deployment - No file was supplied for reference master.dacpac

我是第一次设置数据库项目,我正在尝试 build/deploy 使用 Azure DevOps。我正在使用 Azure (windows-2019) 中托管的 MSBuild 任务进行构建。我在 SQL 服务器上使用命令行任务 运行 从以下工作目录执行 SQLPackage.exe C:\Program Files (x86)\Microsoft Visual Studio19\BuildTools\Common7\IDE\Extensions\Microsoft\SQLDB\DAC0.

我在 SqlPackage.exe:

部署期间遇到 master 和 msdb 数据库错误
No file was supplied for reference master.dacpac; deployment might fail. When C:\Jen_DacpacTest\Artifact\whatever.dacpac was created, the original referenced file was located C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO19\ENTERPRISE\COMMON7\IDE\EXTENSIONS\MICROSOFT\SQLDB\EXTENSIONS\SQLSERVER0\SQLSCHEMAS\MASTER.DACPAC.

我认为对 master 和 msdb 的引用在构建和部署时再次解析(因为它是路径的变量),但事实似乎并非如此。它似乎弄清楚了在构建过程中 $(DacPacRootPath) 是什么,"hardcodes" model.xml 文件中的引用生成到 dacpac 中。 proj 文件中的引用如下所示:

<ArtifactReference Include="$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer0\SqlSchemas\master.dacpac">
      <HintPath>$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer0\SqlSchemas\master.dacpac</HintPath>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <DatabaseVariableLiteralValue>master</DatabaseVariableLiteralValue>
    </ArtifactReference>
    <ArtifactReference Include="$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer0\SqlSchemas\msdb.dacpac">
      <HintPath>$(DacPacRootPath)\Extensions\Microsoft\SQLDB\Extensions\SqlServer0\SqlSchemas\msdb.dacpac</HintPath>
      <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors>
      <DatabaseVariableLiteralValue>msdb</DatabaseVariableLiteralValue>
    </ArtifactReference>

如果 dacpac 解压,model.xml 文件中的内容如下:

<CustomData Category="Reference" Type="SqlSchema">
    <Metadata Name="FileName" Value="C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO19\ENTERPRISE\COMMON7\IDE\EXTENSIONS\MICROSOFT\SQLDB\EXTENSIONS\SQLSERVER0\SQLSCHEMAS\MASTER.DACPAC" />
    <Metadata Name="LogicalName" Value="master.dacpac" />
    <Metadata Name="ExternalParts" Value="[master]" />
    <Metadata Name="SuppressMissingDependenciesErrors" Value="False" />
</CustomData>
<CustomData Category="Reference" Type="SqlSchema">
    <Metadata Name="FileName" Value="C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO19\ENTERPRISE\COMMON7\IDE\EXTENSIONS\MICROSOFT\SQLDB\EXTENSIONS\SQLSERVER0\SQLSCHEMAS\MSDB.DACPAC" />
    <Metadata Name="LogicalName" Value="msdb.dacpac" />
    <Metadata Name="ExternalParts" Value="[msdb]" />
    <Metadata Name="SuppressMissingDependenciesErrors" Value="False" />
</CustomData>

所以我想知道这应该如何工作,因为托管在 Azure 中的 Azure MSBuild 任务(和 Visual Studio 构建任务)将引用来自 Visual Studio Enterprise 的 master 和 msdb dacpacs文件夹,但在 SqlPackage.exe 所在的 SQL 服务器上 运行 进行部署,这些文件位于 BuildTools 文件夹中,而不是 Enterprise 文件夹中。 (我真的不认为我必须在我的 SQL 服务器上安装 VS 企业版才能让它工作?)

在 Azure 中: C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO19\**ENTERPRISE**\COMMON7\IDE\EXTENSIONS\MICROSOFT\SQLDB\EXTENSIONS\SQLSERVER0\SQLSCHEMAS

在 SQL 服务器上: C:\Program Files (x86)\Microsoft Visual Studio19\**BuildTools**\Common7\IDE\Extensions\Microsoft\SQLDB\Extensions\SqlServer0\SQLSchemas

生成服务器上这些文件的路径必须与 sql 服务器上的路径完全匹配,这似乎很奇怪。我认为找到这些 dacpac 引用会更神奇一些,因为据我了解,您不应该手动将它们添加到您的项目中并将它们拖到任何地方。

Database projects deployment - No file was supplied for reference master.dacpac

这是一个典型的 SSDT 问题。生成服务器上这些文件的路径不是导致问题的主要原因。

请检查No file was supplied for reference ABC.dacpac; deployment might fail and

尝试将 master.dacpac 复制到 xx.dacpac 所在的同一文件夹。 (您可以通过在 cmd 中使用 copy/xcopy 命令来执行此操作)并确保您的 CMD 任务的工作目录位于同一文件夹中。希望对您有所帮助:)