【问题标题】:Building SQL Server Database Project In Ubuntu在 Ubuntu 中构建 SQL Server 数据库项目
【发布时间】:2025-12-17 08:40:01
【问题描述】:

我正在构建一个托管在 Ubuntu 环境中的 ASP.NET Core 2.0 Web API 应用程序。到目前为止,我在 Ubuntu 中构建和运行(用于 .NET Core 应用程序)的东西已经取得了巨大的成功。

对于数据库,我的解决方案中包含了一个 SqlProj。该项目包括典型的东西,例如表、SP 和部署前/后脚本。我正在使用以下命令(在我的基于 Windows 的开发机器上)构建和部署这个项目:

msbuild .\MyProject.DB.sqlproj /t:Build /t:Publish /P:SqlPublishProfilePath="./PublishProfiles/MyProject.DB.publish.xml"

当我采用这种方法时,一切都会正确构建和部署;但是,由于我将利用针对 Ubuntu 环境的 .NET Core CLI 命令 + CI/CD,所以我想做一些类似的事情:

dotnet msbuild .\MyProject.DB.sqlproj /t:Build /t:Publish /P:SqlPublishProfilePath="./PublishProfiles/MyProject.DB.publish.xml"

在 Windows 中,我立即收到错误消息:

error MSB4019: The imported project "C:\Program Files\dotnet\sdk\2.1.4\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.

基本上,我要问的是如何在 Ubuntu 环境中成功构建和部署 SqlProj 项目。我试过谷歌搜索,但到目前为止我的运气为零。我发现的所有类似问题都适用于正在编辑 .proj 文件以针对其 VS 文件夹的 SSDT 的个人。所有这些人都在解决 Windows 中的问题。这种方法在 Ubuntu 中不起作用,因为目标文件使用 Windows 注册表项。

编辑:我知道需要 SSDT 才能使用 MSBuild 执行此类部署。我没有发现任何证据表明在 Ubuntu 中甚至可以安装/使用 SSDT。如果不是,也许有替代解决方案?

仅供参考,我知道在 EF Core 中使用代码优先方法是可能的。我正在尝试采用原始 SP 方法(以及利用索引)并使用 SqlProj 跟踪我的所有代码。这将全部从 Git 存储库中存储和 CI/CD。

【问题讨论】:

  • 如何在 Ubuntu 上编译 sqlproj?我无法克服 msbuild 错误。
  • @harsimranb,我无法在 Ubuntu 中构建它。不幸的是,这就是问题所在。 MSBuild 目前不适用于 .SqlProj。我还没有找到解决办法。

标签: sql-server ubuntu msbuild .net-core sql-server-data-tools


【解决方案1】:

不用安装 SSDThttps://www.nuget.org/packages/Microsoft.Data.Tools.Msbuild 就可以使用这个 NuGet 包进行部署 我不知道它是否会在 Ubuntu 上运行或与 dotnet cli 完全集成

【讨论】:

  • 所以这绝对是一条值得遵循的道路。我已经开始研究走这条路的意义,我现在很困惑。我首先尝试将此包添加到我的 SqlProj,但我收到了之前的错误以及“无法为项目'Myproject.sqlproj”创建依赖关系图文件。无法添加包引用。我也找不到任何证据(或指导)能够从 CLI 或 Linux 环境中实现这一点。可能没有人尝试过这个吗?我想我明白了,因为很多都是新的;所以有可能……
  • 对,很遗憾,您不能将其添加为对 SQL 项目的引用。您可以创建一个单独的“构建”项目并通过 PowerShell 或命令行调用 SQLPackage。不确定它是否与 bash 或 .net core 兼容。
  • 我会试试的。我确实担心的一个问题是,从命令行调用 msbuild 似乎只会恢复到我安装此软件包之前安装的内容(即 VS MSBuild 安装)。如何显式调用 Microsoft.Data.Tools.Msbuild 包安装的程序集?在 Ubuntu 中尝试之前,我想确保我理解这部分内容。
  • 不完全确定,因为我在 Windows 上执行此操作并使用包来确保构建的 DacPac 的部署使用正确/相同版本的 SQLpackage,无论安装或未安装什么版本代理人。不过我可能错了,我们可能已经更新了 sqlproj 以指向 packages 文件夹中的 .target 文件
  • 好的。好吧,我感谢迄今为止的帮助。我将开始研究这条道路,直到出现更好的解决方案。一旦我碰壁或找到解决方案,我将发布我的结果。
【解决方案2】:

我无法确定这是否适用于 Ubuntu,但我们最近使用上面提到的 NuGet 包在没有安装 SSDT 的 Windows 构建机器上解决了这个问题。突破来自拼凑下面文章中的细节,特别是使用带有 MSBuild 的 SDK 需要设置环境变量才能工作。

https://blogs.msdn.microsoft.com/ssdt/2016/08/22/part-5-use-your-own-build-and-deployment-agent/

通过添加的信息,我们在解决方案文件夹的根目录中安装了 NuGet 包,然后在 PowerShell 中编写了构建脚本。该脚本首先设置环境变量,然后在具有相应输出目录的 SqlProj 文件上调用 MSBuild。我们当时并没有专门发布,而是在我们的工作流程中将工件发布到 Octopus Deploy,由其进行实际部署。

同样,不确定它是否对 Ubuntu 有帮助,但认为额外的细节可能有用。

【讨论】:

  • 谢谢瑞恩。我们现在可能要做的是在我们的 AWS 设置中设置一个 Windows Server VM,并让它充当我们的构建代理。我承认,为了最终确定这个计划,我还有更多的研究要做。您的信息以及之前的海报应该证明是非常有益的。我真的很感激。
【解决方案3】:

我的 2020 年解决方案

我想在 2020 年重新审视这个问题,并更新我原来问题的答案。

我采用了不同的方法来构建部署 SQL Server 项目。我目前的方法是构建一个使用 vs2017-win2016 代理的管道,并使用它来构建一个 .dacpac。从那里,您构建一个部署管道以将 dacpac(从您的工件 drop)部署到 SQL Server 实例。

这种方法更好地适应 DevOps 方法,并消除了与我以前的解决方案相关的手动过程。

您可以在此处阅读更多信息:

https://docs.microsoft.com/en-us/azure/devops/pipelines/apps/aspnet/build-aspnet-dacpac?view=azure-devops

【讨论】:

  • 谢谢,这看起来很有趣。我是否可以建议您接受自己的答案(毕竟这是您解决问题的方法)以使其对未来的访问者更加可见?
  • @brandon-avant 但这仅适用于 Azure DevOps 或 Azure DevOps Server,对吗?我假设如果想在 Linux(或基于 Linux 的容器)上构建和部署项目,SDK 解决方案会更好,不是吗?
【解决方案4】:

作为替代方案,可以使用 dotnet cli 和 sqlpackage 来实现此目的,如 here 所述,使用 MSBuild Sdk。

你基本上有一个数据库项目。我们称之为“数据库项目”。

您创建一个新项目,它是一个 .NET 标准 c# 库,您可以将其称为“DatabaseProject.Build”。

然后您可以像这样配置 DatabaseProject.Build.csproj:

<Project Sdk="MSBuild.Sdk.SqlProj/1.11.4">
   <PropertyGroup>
       <TargetFramework>netstandard2.0</TargetFramework>
       <Configurations>Debug;Release</Configurations>
   </PropertyGroup>
   <ItemGroup>
       <Content Include="..\DatabaseProject\**\*.sql" />
       <Content Remove="..\DatabaseProject\bin\*.sql" />
       <Content Remove="..\DatabaseProject\**\*.PostDeployment.sql" />
       <PostDeploy Include="..\DatabaseProject\**\*.PostDeployment.sql" />
   </ItemGroup>
</Project>

注意 使用的版本 V1.11.4 是在编辑本文时支持 Visual Studio 随附的当前 .NET SDK 的版本。查看the github repo 以获取适用于您的项目的最新 nuget 版本。

使用 dotnet build 将生成一个 dacpac,您可以将其与 dotnet publish 或 sqlpackage 一起使用。

然后您可以发布到您的 SqlServer 实例。 如果你像我一样在 CI 中使用 linux 运行器,你可能需要 SqlServer 身份验证方法,然后运行其中一个

sqlpackage /Action:Publish \    
/SourceFile:\"DatabaseProject.Build/bin/Debug/netstandard2.0/DatabaseProject.Build.dacpac\" \
/TargetServerName:MyDatabaseServerName \
/TargetDatabaseName:MyDatabaseName \
/TargetUser:Username\
/TargetPassword:Password

或使用由 Visual Studio 生成的配置文件:

sqlpackage /Action:Publish /Profile:\"DatabaseProject/PublishProfile/MyProfile.publish.xml\" /SourceFile:\"DatabaseProject.Build/bin/Debug/netstandard2.0/DatabaseProject.Build.dacpac\"

dotnet publish /p:TargetServerName=MyServerName /p:TargetDatabaseName=MyDatabseName /p:TargetUser=<username> /p:TargetPassword=<password>

【讨论】:

  • 很好,这就是我最初想要的。我需要在某个时候尝试一下。
  • 我已经测试了第一部分(建筑),它运行良好。我所做的是在与我的 .sqlproj 文件相同的文件夹中创建一个 .csproj 文件。文件夹或子文件夹中的任何 .sql 文件都将包含在包中,因此请确保排除任何不应成为 DACPAC 一部分的脚本。
  • 此解决方案使用已达到使用寿命的 donet 2.0(也为 3.x)。你知道 linux 的任何其他解决方案吗,或者我最好忘记它并使用基于 Windows 的系统。
  • @PlayingWithBI 我不确定您所说的先生是什么意思,您指的是 .net 标准吗?如果是这种情况,它应该可以在当前最新版本的 dotnet 上运行。您可以查看here。虽然我还没有尝试过新的 .net 5 项目,但 netstandard2.0 应该不成问题。如果您真的尝试一下,我想听听您的意见=)
  • @PlayingWithBI 好吧,我猜你使用的是我当时提供的 Sdk="MSBuild.Sdk.SqlProj/1.3.0" 版本。它确实不支持 .net 5,而且您的构建有问题。如果你去项目的 github repo,你会看到 nuget 包的版本现在是 V1.11.4 并且它支持 .Net 5。所以而不是 1.3.0 尝试使用 1.11.4。我希望它能解决你的构建问题。我也会更新我的答案。
【解决方案5】:

如前所述,在 linux 代理上构建 DacPac 文件的最简单方法是通过 MSBuild.Sdk.SqlProj 完成 转到您的数据库项目目录,与 .sqlproj 文件并行创建一个类似 DB.Build 的目录,在其下创建 DB.Build.csproj 复制内容,如下所示

<Project Sdk="MSBuild.Sdk.SqlProj/1.1.0"> <!-- This will pull in the required tools and dependencies to build a .dacpac with .NET Core -->
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <Content Include="..\src\DB\masterdata\**\*.sql" /> <!-- link in the new .csproj to the .sql scripts in your existing database project -->
    </ItemGroup>
</Project>

运行后你会看到dacpac文件出现在DB.Build/bin/Release/netstandard2.0/DB.Build.dacpac

这是我的构建代理输出(Azure devops 上的 Ubuntu 代理)

Starting: SQL DB build Release
==============================================================================
Task         : .NET Core
Description  : Build, test, package, or publish a dotnet application, or run a custom dotnet command
Version      : 2.187.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/build/dotnet-core-cli
==============================================================================
Info: .NET Core SDK/runtime 2.2 and 3.0 are now End of Life(EOL) and have been removed from all hosted agents. If you're using these SDK/runtimes on hosted agents, kindly upgrade to newer versions which are not EOL, or else use UseDotNet task to install the required version.
/opt/hostedtoolcache/dotnet/dotnet build /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/RecommenderAPI.DB.Build.csproj -dl:CentralLogger,"/home/vsts/work/_tasks/DotNetCoreCLI_5541a522-603c-47ad-91fc-a4b1d163081b/2.187.0/dotnet-build-helpers/Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll"*ForwardingLogger,"/home/vsts/work/_tasks/DotNetCoreCLI_5541a522-603c-47ad-91fc-a4b1d163081b/2.187.0/dotnet-build-helpers/Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" --configuration Release /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=/home/vsts/work/1/recommender-service-cicd/DacPac/
Microsoft (R) Build Engine version 16.5.0+d4cbfca49 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 51.72 ms for /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/RecommenderAPI.DB.Build.csproj.
  Using package name RecommenderAPI.DB.Build and version 1.0.0
  Using SQL Server version Sql150
  Deleting existing file /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/obj/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac
  Writing model to /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/obj/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac
  RecommenderAPI.DB.Build -> /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/bin/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.71

Finishing: SQL DB build Release

注意:确保在构建之前的步骤中恢复 NuGet 包

【讨论】: