
CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载导读本文围绕 Orchard Core 的OrchardCore.Deployment模块展开系统讲解如何通过部署计划Deployment Plan构建、导出和导入包含内容与配置的部署包以及如何通过IDeploymentSource、DeploymentStep和显示驱动扩展自定义部署步骤。读完本文你将掌握从后台创建部署计划、执行导出、导入.zip包与 JSON 配方、用deployment配方步骤编程式创建计划以及用几行 C# 代码注册自定义部署步骤的完整实战能力。一、模块定位部署包与配方的基础设施OrchardCore.Deployment模块提供了一套构建、导出和导入部署包deployment package的能力用于在多个 Orchard Core 站点之间迁移内容和配置。一个部署包的核心构成是一份Recipe.json文件记录配方元数据与配方步骤recipe steps若干配方步骤所需附加文件如媒体文件、自定义文件等。从源码看包的生成过程收敛在 DeploymentPlanResult.cs 中构造函数会把配方描述符RecipeDescriptor的name、displayName、description、author、website、version、issetuprecipe、categories、tags等元数据写入Recipe这个JsonObjectFinalizeAsync()方法则把收集到的步骤数组写入Recipe[steps]并通过IFileBuilder.SetFileAsync(Recipe.json, ...)将配方落盘为包内的Recipe.json文件。这解释了为什么部署包与 setup 配方共用同一套配方基础设施——二者最终都是一份可被配方引擎执行的Recipe.json。配方步骤的执行机制可参考 Recipes 模块文档其中说明了配方的执行流程以及由其他功能模块贡献的配方步骤。二、部署计划Deployment Plan有序的步骤列表2.1 什么是部署计划一个部署计划DeploymentPlan是一组有序的部署步骤DeploymentStep列表。从 DeploymentPlan.cs 可以看到它的数据模型非常轻量public class DeploymentPlan { public long Id { get; set; } public string Name { get; set; } public ListDeploymentStep DeploymentSteps { get; init; } []; }每个步骤在执行时向生成的包中贡献配方步骤recipe steps或文件。可用的步骤取决于当前租户启用了哪些功能。例如Contents 功能贡献导出内容项的步骤Media 功能贡献导出媒体库文件的步骤Queries 功能贡献导出查询定义的步骤。2.2 创建并执行一个计划在管理后台按如下路径操作进入Tools工具 Deployments部署 Plans计划点击Add Deployment Plan添加部署计划输入名称并保存打开该计划点击Add Step添加步骤配置每个步骤并按步骤应写入包的顺序排列它们后台提供了steporder.js脚本用于拖拽排序见 Assets/js/steporder.js点击Execute执行随后选择File Download文件下载即可生成并下载一个.zip部署包。执行过程的核心实现位于 DeploymentManager.cs 的ExecuteDeploymentPlanAsync方法它遍历计划中的每个步骤把步骤交给注册在容器中的所有IDeploymentSource依次处理每个 source 都有机会响应它关心的步骤类型最后调用result.FinalizeAsync()收尾生成Recipe.json。这与文档步骤按Recipe.json中出现的顺序运行的描述一一对应。2.3 模块自带的通用步骤Deployment 模块自身提供以下通用步骤定义位于 Steps 目录步骤用途Custom File自定义文件向包内指定路径添加一个文本文件。JSON RecipeJSON 配方直接将 recipe-step JSON 写入Recipe.json。Recipe File配方文件设置配方元数据如名称、版本、分类以及是否为 setup 配方。Deployment Plans部署计划导出部署计划的定义以便在另一站点上重建这些计划。[!NOTE] 只有当提供某个步骤的功能被启用时该步骤才可用。如果导入的计划中包含未知步骤类型请先启用相关功能再重新导入该计划。作为兜底模块在 Startup.cs 中通过AddJsonDerivedTypeFallbackDeploymentStep, UnknownDeploymentStep()把无法识别的步骤类型反序列化为UnknownDeploymentStep并在 UnknownDeploymentStepDriver.cs 中为其提供摘要显示驱动避免因功能缺失导致整个包解析失败。以Custom File步骤为例其实现 CustomFileDeploymentSource.cs 极为简洁直观展示了步骤 → 文件的映射关系public sealed class CustomFileDeploymentSource : DeploymentSourceBaseCustomFileDeploymentStep { protected override Task ProcessAsync(CustomFileDeploymentStep step, DeploymentPlanResult result) result.FileBuilder.SetFileAsync(step.FileName, Encoding.UTF8.GetBytes(step.FileContent)); }它把用户配置的FileName与FileContent通过IFileBuilder写入包内。IFileBuilder的抽象定义在 IFileBuilder.cs其扩展方法提供了SetFileAsync(subpath, byte[])的重载方便以字节数组写入文件。三、导入部署包在管理后台进入Tools工具 Deployments部署有两种导入方式Package Import包导入接受一个.zip部署包或一个.json配方文件JSON ImportJSON 导入直接在编辑器中粘贴配方 JSON 并导入。导入一个包会立即执行其配方步骤按其在Recipe.json中出现的顺序依次运行。导入流程的底层入口是DeploymentManager.ImportDeploymentPackageAsync(IFileProvider deploymentPackage)它逐个调用注册的IDeploymentTargetHandler.ImportFromFileAsync并刻意不并行执行以避免处理器之间潜在的竞态条件见 DeploymentManager.cs。[!WARNING] 只能从可信来源导入包和 JSON。配方步骤可以修改站点配置、功能、内容定义和内容。**Import Data导入数据**权限属于安全关键权限应仅授予可信角色。四、从配方创建部署计划deployment配方步骤deployment配方步骤由 DeploymentPlansRecipeStep.cs 实现用于创建或更新部署计划。每个条目需要提供一个计划名称和一个带类型的部署步骤列表。例如创建一个名为 Add a custom file 的计划其中包含一个 Custom File 步骤{ steps: [ { name: deployment, Plans: [ { Name: Add a custom file, Steps: [ { Type: CustomFileDeploymentStep, Step: { Id: custom-file, Name: CustomFileDeploymentStep, FileName: notes/readme.txt, FileContent: Generated by a deployment plan. } } ] } ] } ] }字段说明Type注册过的部署步骤类型名。AddDeploymentTStep()扩展方法内部会调用AddJsonDerivedTypeInfoTStep, DeploymentStep()见 ServiceCollectionExtensions.cs将具体步骤类型注册为DeploymentStep的 JSON 派生类型从而使反序列化能够还原为正确的步骤实例Step下的属性为该类型专属的配置字段如上面的FileName、FileContent。约束配方运行时所有提供被引用步骤类型的功能都必须处于启用状态否则该配方步骤不会对任何计划做出更改。五、权限模型Deployment 模块定义了三项权限见 Permissions.cs 与 DeploymentPermissions.cs权限用途Manage deployment plans管理部署计划创建、编辑、重排和删除计划及其步骤。Export Data导出数据执行计划并导出其部署包。Import Data导入数据导入并执行部署包或配方 JSON。Administrator管理员角色默认获得全部三项权限Permissions.GetDefaultStereotypes()为Administrator角色装配了全部权限集见 Permissions.cs。六、扩展部署编写自定义部署步骤模块可以贡献自定义部署步骤需要三步实现IDeploymentSource负责把步骤处理为包内容从DeploymentStep派生步骤模型负责承载步骤配置可选添加一个显示驱动display driver用于渲染步骤的编辑器界面。IDeploymentSource的抽象只有一个方法public interface IDeploymentSource { Task ProcessDeploymentStepAsync(DeploymentStep step, DeploymentPlanResult result); }同时将三者注册在一起services.AddDeploymentMyDeploymentSource, MyDeploymentStep, MyDeploymentStepDisplayDriver();AddDeploymentTSource, TStep, TDisplayDriver扩展方法见 ServiceCollectionExtensions.cs会依次完成注册IDeploymentSourceTryAddEnumerableTransient、注册IDeploymentStepFactory同样是 transient 枚举注册、注册 JSON 派生类型信息以及通过AddDisplayDriverDeploymentStep, TDisplayDriver注册编辑界面的显示驱动。若步骤不需要独立 source如纯元数据型步骤可使用AddDeploymentWithoutSourceTStep, TDisplayDriver模块自身的 Recipe File 步骤即采用这种方式见 Startup.cs。6.1 在构造函数中设置 Category 与 Title在步骤的构造函数中设置Category和Titlepublic MyDeploymentStep() { Name nameof(MyDeploymentStep); Category S[Content]; Title S[Export My Data]; }说明Name是步骤类型的字符串标识Category是本地化字符串用于在步骤选择器中分组展示Title是本地化字符串保存步骤的显示名称会作为步骤添加/编辑界面及其面包屑的标题展示因此这些界面不再需要额外的h5标题。从 DeploymentStep.cs 的实现可以看到Category与Title都标注了[JsonIgnore]永远不会被持久化。源码注释解释了原因步骤通过无参构造函数重新水合rehydrate该构造过程不解析本地化器因此值总是从步骤工厂构建的全新实例读取若持久化还会因为LocalizedString没有可供System.Text.Json调用的构造函数而破坏计划的反序列化。6.2 源Source如何产出包内容IDeploymentSource处理配置好的步骤并把配方步骤或文件添加到DeploymentPlanResult中。DeploymentPlanResult提供了三个核心成员Recipe配方元数据与步骤集合的 JSON 容器StepsIListJsonObject收集各个 source 贡献的配方步骤 JSONFileBuilderIFileBuilder向包内写入任意附加文件。因此自定义 source 既可以result.Steps.Add(jsonStep)添加配方步骤也可以result.FileBuilder.SetFileAsync(subpath, bytes)添加文件最终统一由FinalizeAsync()组装为完整的Recipe.json。6.3 自定义导出目的地Target如果想自定义包的导出目的地例如推送到远程服务、写入云存储等可以注册IDeploymentTargetProvider。Deployment 模块默认提供的FileDownloadDeploymentTargetProvider见 Services/FileDownloadDeploymentTargetProvider.cs实现了文件下载目标DeploymentManager.GetDeploymentTargetsAsync()会聚合所有 provider 返回的目标列表供前台执行计划时选择。若要将包直接发送到另一台 Orchard Core 站点请参阅 Remote Deployment 模块文档。七、常见问题与最佳实践导入时遇到未知步骤类型说明提供该步骤的功能未启用。先在目标站点启用相应功能再重新导入模块的UnknownDeploymentStep兜底机制可以避免解析崩溃但只有启用功能后才能正确重建该步骤。步骤顺序即执行顺序在计划中拖动排序时务必让先决条件步骤如先导出内容定义再导出内容排在前面导入时严格按Recipe.json顺序执行。配方元数据一致性包的name、displayName、version等元数据在DeploymentPlanResult构造时即被写入Recipe File 步骤用于在导出前调整这些元数据。权限最小化Import Data与Export Data权限应只授予可信角色尤其是Import Data它等同于在目标站点上执行任意配方逻辑。八、相关资源模块源码src/OrchardCore.Modules/OrchardCore.Deployment控制器、步骤实现、视图与前端脚本抽象层源码src/OrchardCore/OrchardCore.Deployment.AbstractionsDeploymentStep、IDeploymentSource、DeploymentPlanResult、ServiceCollectionExtensions核心服务源码src/OrchardCore/OrchardCore.Deployment.CoreDeploymentManager、FileBuilder、权限定义配方执行机制Recipes 模块文档远程部署Deployment.Remote 模块文档赞分享CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载相关推荐Azure Data Studio 资源部署扩展Resource Deployment完全指南基于 Notebook 向导部署 SQL Server 与 Azure 数据服务Azure Data Studio 资源部署扩展Resource Deployment完全指南基于 Notebook 向导部署 SQL Server 与数据库客户端桌面应用数据分析ExoPlayer Opus 扩展模块LibopusAudioRenderer构建与接入指南ExoPlayer Opus 扩展模块LibopusAudioRenderer构建与接入指南 导读 本指南围绕 ExoPlayer 仓库中的 extensi音视频移动开发CPython Windows 扩展模块构建指南MSVC 编译、DLL 导入库与 Py_NO_LINK_LIB 机制CPython Windows 扩展模块构建指南MSVC 编译、DLL 导入库与 Py_NO_LINK_LIB 机制 本篇基于 CPython 仓库官方文档编程语言语言运行时解释器标准库上一篇Ajenti Core and stock plugins用户会话管理监控与终止活动连接下一篇loadable-components与GraphQL集成数据获取与代码分割创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考