.NET 数据层应用程序框架 (DacFx) 库提供了可用于为数据库项目修改生成和部署操作的行为的扩展点。
- Build (BuildContributor): 在完全验证项目模型后生成 SQL 项目时,将执行这种类型的扩展。 生成参与者不仅可以访问已完成的模型,还可以访问生成任务的所有属性以及任何自定义参数。
- 部署(DeploymentPlanModifier): 这种类型的扩展程序在 SQL 项目被部署时执行,作为部署管道的一部分,生成部署计划之后但在执行之前。 可以使用 DeploymentPlanModifier 通过添加或删除步骤来修改部署计划。 部署参与者可以访问部署计划、比较结果以及源模型和目标模型。
- 部署 (DeploymentPlanExecutor):在执行部署计划并提供对部署计划的只读访问权时,将执行此类扩展。 DeploymentPlanExecutor 将根据部署计划执行操作。
扩展性方案示例
可以实现生成或部署参与者以支持以下示例方案:
- 在项目生成期间生成架构文档 - 若要支持此方案,你需要实现 BuildContributor 并重写 OnExecute 方法以生成架构文档。 您可以创建一个目标文件,该文件定义用于控制是否运行扩展并指定输出文件的名称的默认参数。
- 在部署 SQL 项目时生成差异报告 - 若要支持此方案,你需要实现 DeploymentPlanExecutor,它可在部署 SQL 项目时生成 XML 文件。
- 修改部署计划以更改移动数据的时间 - 若要支持此方案,你需要实现 DeploymentPlanModifier 并循环访问部署计划。 对于该计划中的每个 SqlTableMigrationStep,您需要检查比较结果以确定是应执行还是跳过该步骤。
- 在部署 SQL 项目时将文件复制到生成的 dacpac - 若要支持此方案,你需要实现部署贡献者并重写 OnEstablishDeploymentConfiguration 方法,以指定由项目系统标记为 DeploymentExtensionConfiguration 的文件。 这些文件应复制到输出文件夹并添加到生成的 dacpac 中。 也可以修改参与者以将多个文件合并为一个新文件,此文件将复制到输出文件夹并添加到部署清单中。 在部署期间,可以实现 OnApplyDeploymentConfiguration 方法以从 dacpac 中提取这些文件,并准备这些文件以便在 OnExecute 方法中使用。
贡献者可以在运行时接受输入,作为名称和值参数对。 这些参数使最终用户能够在生成或部署时自定义参与者的行为。 例如,你可以允许用户指定输入或输出文件的名称或者控制模型中的对象的选择。
部署参与者
SQL 项目的部署过程通过部署参与者支持扩展性,这些参与者可以访问部署计划,并且可以修改它 (DeploymentPlanModifier) 或基于计划实施操作 (DeploymentPlanExecutor)。 部署参与者可以访问部署计划、比较结果以及源模型和目标模型。 使用 DeploymentPlanModifier,你可以使用部署参与者在部署计划中添加或删除步骤,或修改部署计划中的步骤。 DeploymentPlanModifiers 是最常用的部署参与者。
部署参与者可通过参数化重复使用,并且可在多个项目中使用。 除了 DacExtensions 的存档示例之外,社区成员还创建并共享了自己的可重复使用的部署贡献者作为开源项目。
SqlPackage 集成
SqlPackage 是一个命令行实用工具,可用于创建和部署 SQL 项目。 与 SqlPackage 一起使用时,部署贡献者可以自定义发布过程,并且可以通过发布操作的属性指定,例如 /p:AdditionalDeploymentContributors。 部署参与者必须位于 SqlPackage 可访问的位置,例如与 SqlPackage 可执行文件相同的文件夹或属性 /p:AdditionalDeploymentContributorPaths中指定的文件夹中。 有关发布操作和可用于指定部署参与者的属性的详细信息,请参阅 SqlPackage 发布。
在这些情况下,部署参与者需要使用与 SqlPackage 相同的 DacFx 库主版本进行构建:
- 使用 SqlPackage 的 .NET Framework 版本,这需要与部署组件的主要版本号匹配。
- 每当用修改后的 DacFx 库 API 定义来更新 SqlPackage 时,这些定义可能会随版本而变化。 重大更改仅限于主要版本更新。
如果未使用兼容版本的 DacFx 构建部署贡献者,在运行时尝试加载扩展时,SqlPackage操作将失败。 当部署参与者无法在 SqlPackage 中加载时,会看到类似于以下消息的错误消息:
Could not load extensions from file 'D:\a\_work\....dll' because the assembly has dependency to older versions of DacFx. For more information check https://aka.ms/sqlprojects-extensions
Error SQL0: Required contributor with id 'MyCompany.MyExtension' could not be loaded.
System.Management.Automation.RemoteException
Contributor initialization error.
在自动化管道中将部署参与者与 SqlPackage 集成时,请考虑管理在生成代理上安装的 SqlPackage 版本。 通过管理 SqlPackage 安装,可以确保它与用于生成部署参与者的 DacFx 库的版本匹配。 为了提高灵活性,请使用 dotnet 工具 Microsoft.SqlPackage 而不是 .NET Framework SqlPackage。 有关如何在工作流中安装 SqlPackage,以便在无法修改环境的情况下对生成代理进行操作的详细信息,请参阅 开发管道中的 SqlPackage 一文。