如何在Linux docker容器中构建需要SSDT的.sqlproj?

问题描述

我想在Linux容器内构建.sqlproj。问题在于构建.sqlproj依赖于SSDT,并且到目前为止,我找不到可以在Linux上独立安装的SSDT

错误,我在容器中看到正在运行'dotnet msbuild':

error MSB4019: The imported project "/usr/share/dotnet/sdk/2.2.402/Microsoft/VisualStudio/v11.0/SSDT/Microsoft.Data.Tools.Schema.sqlTasks.targets" was not found. Confirm that the path in the <Import> declaration is correct,and that the file exists on disk.

搜索.sqlproj文件中的问题,我看到我们正在尝试导入Schema.sqlTask​​s.targets文件,我假设该文件是SSDT创建的:

<Import Condition="'$(sqlDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.sqlTasks.targets" />

我在测试“ dotnet构建”时看到了相同的错误

有Windows独立选项:

https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt?redirectedfrom=MSDN&view=sql-server-ver15

https://www.nuget.org/packages/Microsoft.Data.Tools.Msbuild/10.0.61804.210

有没有人找到在Linux容器中提供SSDT的方法

目标状态生成dacpac的构建步骤将在容器内部进行。

当前状态:现在,我在机器上使用Visual Studio作为构建计算机,然后将dacpac复制到容器中,然后sqlpackage.exe可以发布架构。

为什么要使用Linux??这个经过docker化处理的数据库支持在Linux容器中运行的服务堆栈,因此Windows容器并不理想。

解决方法

好吧,因此在ErikEJ和其他社区成员的帮助下,在Brett Rowberry在评论中为您提供的git hub链接上,我终于找到了解决方法。

要遵循的步骤非常简单。

  1. 添加您的SQL Server项目

  2. 添加一个.NET标准类库项目,并将其命名为“ database.build”

  3. 从类库项目中删除所有代码,并修改csproj文件,使其读取类似于以下内容的

    网络标准2.0
  4. 更改解决方案的属性,以便不为所有配置构建sql server项目。

完成此操作后,您会发现仍然可以访问Visual Studio中的SQL数据库项目,并获得所有语法突出显示和智能提示,但是CI会通过链接的类库构建SQL代码并生成准备在其输出文件夹中放置一个dacpac。

我在这里写了一篇博客文章,详细解释了这一切: https://shawtyds.wordpress.com/2020/08/26/using-a-full-framework-sql-server-project-in-a-net-core-project-build/