其他人经常建议的软件包
R&R WFM's MSBuild.Sdk.SqlProj并不是来自微软,它并不能真正进行“真实的SSDT构建”。它不使用SSDT构建工具,而是一个独立的第三方工具,可以生成功能有限的DACPAC包。这些信息并不来自我对该工具的使用经验,而是在我试图研究我在DACPAC和Linux上还剩下哪些选项时,在某个地方读到的。虽然我无法以任何方式确认这些信息的真实性,但看起来是真实的,仓库中没有任何“Microsoft”标志,并且我在多个不相关的网站上读到了类似的警告,由据称是不同的人发布。
话虽如此,这是一个非常棒的工具,肯定需要大量的工作和知识。
但还有另一个工具。
最近,微软开始开发他们自己的跨平台 SSDT 构建工具 Microsoft.Build.Sql,源自 DacFx。在撰写本文时,它仍处于预览状态,当前版本为 0.1.10。如果你搜索如何使用该工具的文章,通常会看到 0.1.3 或 0.1.7 的版本。
微软提供了一个很好的指南,说明如何转换由 VisualStudio+SSDT 生成的现有 .sqlproj 文件。这篇文章简洁明了,但需要进行一些明显的修正。该文章还指向一个简约的新式 .sqlproj 文件,但链接已失效,不过该文件位于附近的一个文件夹中。
文章提到新式项目支持通配符(所以Include="folder/**/*.sql"代替列出所有文件),并且包含所有SQL文件已经是默认行为,因此像示例中的“空”项目文件将获取所有SQL文件 - 但要小心,并阅读关于与VisualStudio兼容性的最后一段。
根据这些信息,我成功地转换了我的.sqlproj文件。我按照那里解释的步骤进行操作,同时没有删除任何现在不再需要的文件包含,所以VS很满意。
我的.sqlproj文件现在看起来是这样的:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0">
<Sdk Name="Microsoft.Build.Sql" Version="0.1.10-preview" />
<PropertyGroup>
<Name>xxxxxxxxxxxxxxxx</Name>
<DSP>Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider</DSP>
<ModelCollation>1033,CI</ModelCollation>
<TargetDatabaseSet>True</TargetDatabaseSet>
<DefaultCollation>Latin1_General_100_CI_AS</DefaultCollation>
</PropertyGroup>
<ItemGroup>
<Folder Include="Properties" />
<Folder Include="Tables" />
<Folder Include="Views" />
<Folder Include="Procedures" />
</ItemGroup>
<ItemGroup>
<Build Include="Tables\xxxxxxxxx.sql" />
<Build Include="Tables\xxxxxxxxx.sql" />
<Build Include="Views\xxxxxxxxx.sql" />
<Build Include="Views\xxxxxxxxx.sql" />
<Build Include="Procedures\xxxxxxxxx.sql" />
<Build Include="Procedures\xxxxxxxxx.sql" />
</ItemGroup>
<ItemGroup>
<RefactorLog Include="xxxxxxxxx.refactorlog" />
</ItemGroup>
<ItemGroup>
<PostDeploy Include="Script.PostDeployment1.sql" />
</ItemGroup>
<ItemGroup>
<PreDeploy Include="Script.PreDeployment1.sql" />
</ItemGroup>
<ItemGroup>
<None Include="xxxxxxxxx.publish.xml" />
</ItemGroup>
</Project>
那个“xxx”部分当然只是匿名化。
我能够通过简单的方式成功构建这个项目并获得一个DACPAC文件。
cd solutionroot
dotnet build MyProject.sln
或者
cd solutionroot/dbproject
dotnet build MyProject.sqlproj
我不需要添加
/p:NetCoreBuild=true
- 在
0.1.10
的工具中,它会检测到是从
dotnet
命令运行,并自动设置这个参数。
这在我的本地开发机(Win10,VS2022,
dotnet --version
= 7.0.302)上构建时有效,也在CI代理(Amazon Linux 2)上运行时有效。
CI系统是AWS CodeBuild,使用的脚本如下:
version: 0.2
phases:
install:
runtime-versions:
dotnet: latest
pre_build:
commands:
- dotnet --version
- dotnet restore
build:
commands:
- dotnet build -c Release
其实没什么大事发生。相关的输出部分如下:
[Container] 2023/07/08 20:36:06 Running command dotnet --version
6.0.408
(...snip...)
xxxx.Database -> /codebuild/output/src3703237027/src/git-codecommit.eu-west-3.amazonaws.com/v1/repos/xxxx/xxxx/xxxx/bin/Release/xxxx.dll
xxxx.Database -> /codebuild/output/src3703237027/src/git-codecommit.eu-west-3.amazonaws.com/v1/repos/xxxx/xxxx/xxxx/bin/Release/xxxx.dacpac
所以实际上花了6.0的时间,与我的本地环境不同。有点奇怪,但它仍然构建了dacpac。
值得注意的两件事情 - 虽然`dotnet build`能够构建DACPAC,但工具是“预览版”,如果我记得正确的话,GitHub上的文档提到并不支持所有功能。我不知道这些功能差距与rr-wfm的nuget包中的差距相比如何,但该工具仍在开发中,所以还有希望 :)
第二个需要注意的是,虽然`dotnet build`能够构建DACPAC,但`dotnet publish`无法运行它。尝试运行时会出错。
dotnet publish -c Release -p:SqlPublishProfilePath=./xxxx.publish.xml
最好的情况下,目前会出现以下错误。
/root/.nuget/packages/microsoft.build.sql/0.1.10-preview/tools/netstandard2.1/Microsoft.Data.Tools.Schema.SqlTasks.targets(1869,7): error MSB4018: The "SqlPublishTask" task failed unexpectedly.
/root/.nuget/packages/microsoft.build.sql/0.1.10-preview/tools/netstandard2.1/Microsoft.Data.Tools.Schema.SqlTasks.targets(1869,7): error MSB4018: System.PlatformNotSupportedException: Microsoft.Data.SqlClient is not supported on this platform.
/root/.nuget/packages/microsoft.build.sql/0.1.10-preview/tools/netstandard2.1/Microsoft.Data.Tools.Schema.SqlTasks.targets(1869,7): error MSB4018: at Microsoft.Data.SqlClient.SqlConnectionStringBuilder..ctor(String connectionString)
/root/.nuget/packages/microsoft.build.sql/0.1.10-preview/tools/netstandard2.1/Microsoft.Data.Tools.Schema.SqlTasks.targets(1869,7): error MSB4018: at Microsoft.Data.Tools.Schema.Common.SqlClient.SqlConnectionFactory..ctor(String connectionString)
/root/.nuget/packages/microsoft.build.sql/0.1.10-preview/tools/netstandard2.1/Microsoft.Data.Tools.Schema.SqlTasks.targets(1869,7): error MSB4018: at Microsoft.Data.Tools.Schema.Sql.Deployment.CachedRegistryConnectionString..ctor(String connectionString, Boolean loadFromRegistry)
我在尝试在本地开发机器上运行dotnet publish
(一切都正常),以及在CI代理服务器上尝试时,都遇到了此错误。
这是因为当前的0.1.10
工具不支持dotnet publish
命令。由于某种重要的内部原因,它可能根本不会得到支持。
除了dotnet publish
之外,DacFx提供了一个单独的工具,称为SqlPackage。 它被宣传为运行DACPACs的跨平台工具。
可以使用dotnet
安装它:
dotnet tool install -g microsoft.sqlpackage
它可以发布
DACPAC,但命令行语法略有不同(有关详细信息,请参见上面的链接):
SqlPackage /Action:Publish /SourceFile:".dacpac" /Profile:"....."
我还没有尝试安装和运行这个SqlPackage工具,但它看起来非常有前途。