Visual Studio SSDT 数据库项目 (.sqlproj) 构建 - 使用不带 MSBUILD 的 CLI 生成 .dacpac (msbuild.exe)

Visual Studio SSDT Database project (.sqlproj) build - generate .dacpac using CLI without MSBUILD (msbuild.exe)

看起来 dotnet CLI 似乎不支持数据库项目 (.sqlproj) 根据此:https://github.com/dotnet/sdk/issues/8546

在我的例子中 dotnet build 失败并出现以下错误:

C:...*.Database.sqlproj(59,3): error MSB4019: The imported project "C:\Program Files\dotnet\sdk.1.301\Microsoft\VisualStudio\v11.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" was not found. Confirm that the expression in the Import declaration "C:\Program Files\dotnet\sdk.1.301\Microsoft\VisualStudio\v11.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" is correct, and that the file exists on disk.

不用说了,解决方案通过Build in Visual Studio编译生成.dacpac。我需要这个从命令行工作。除了 msbuild.exe 之外,我还有其他解决方案吗?也许有一些可爱的 nuget 包可以提供帮助?

Do I have any solutions other than msbuild.exe? Perhaps some lovely nuget package out there that could help?

实际上,除了msbuild.exe,没有其他构建数据库项目的构建工具。所以你必须使用 msbuild.exe.

VS2017以来,msbuild.exe有一个不依赖VS的单独版本IDE称为VS构建工具。而且是与VS Workload环境集成的构建命令行。

所以我认为你想要一个构建服务器上的轻量级构建工具而不是庞大的 VS IDE,如果是这样,你应该下载它。

建议

1) 下载 build tool for VS2019 所有下载 --> [=55= 的工具] ] 2019-->构建工具 Visual Studio 2019.

2)记得要select相应的工作量数据存储和处理构建工具

完成后,您可以使用它构建您的数据库项目。

我已经按照这篇文章中的描述让它工作:https://erikej.github.io/efcore/2020/05/11/ssdt-dacpac-netcore.html

它需要一种特殊类型的 .NET Standard Visual Studio 项目 - MSBuild.Sdk.SqlProj(nuget 下载),它在编译时从数据库项目复制脚本。

这是我的 build_database.cmd 代码:

SET db_project=Database.Build
dotnet tool install -g dotnet-script  
cd %db_project%
dotnet build
dotnet-script Program.csx 

和一个 C# 脚本 (Program.csx),它使用 Microsoft.SqlServer.DACFx nuget 包创建和部署 .dacpac:

#r "nuget: Microsoft.SqlServer.DACFx, 150.4769.1"
using Microsoft.SqlServer.Dac;

var dbName = "SampleDatabase";
var connectionString = $"Data Source=.;Initial Catalog={dbName};Integrated Security=True;";
var dacpacLocation = Directory.GetFiles(@".\bin", "Database.Build.dacpac", 
                                                           SearchOption.AllDirectories)[0];
var dbPackage = DacPackage.Load(dacpacLocation);
var services = new DacServices(connectionString);

services.Deploy(dbPackage, dbName, true); 

这种方法是完全自动化的,可以在 CI 或本地开发环境中使用,显然,它也是跨平台的(尽管我只在 Windows 上测试过)。 希望这会有所帮助:)

我的方法:

  1. 安装 Visual Studio 构建工具 2019

包括“数据存储和处理构建工具”工作流程和 .NET Framework 4.6.1 目标包(单个组件)