在团队内处理小组件或处理分发工作时,Limyee 电商平台服务使开发、版本控制和部署更加容易。
使开发和部署更轻松
为了使开发更容易,您可以使用 Limyee 电商平台的核心组件的功能,特别是:
- 出厂默认小组件提供程序。出厂默认小组件提供程序允许将小组件源存储在文件系统上。这使得可以使用源代码管理系统:SVN、Git 或 TFS 等,从而更好地实现团队内部的开发。
- 开发者模式。开发者模式是 Limyee 电商平台的一项功能,它使开发者能够在平台小组件编辑器中处理出厂默认小组件,同时直接保存到文件系统(以启用源代码管理)。
- 自动安装源文件。使用 IInstallablePlugin 实现以及 UI 自动化 API 和嵌入式资源中的小组件版本控制支持 ,可以为作为出厂默认提供程序的一部分部署的自定义小组件提供完整的安装故事。
让我们看一个示例实现,然后讨论利用这些功能的详细信息。
实现
此方法示例实现的源代码文件可供下载:
支持小组件源代码管理和安装的小组件出厂默认提供程序的示例实现。
此实现包含两个项目:Samples 和 FactoryDefaultWidgetFileManifestUpdater。Samples 项目标识创建的小组件是出厂默认提供程序。此特定实现还包括对自动文件安装和开发者模式注意的事项。FactoryDefaultWidgetFileManifestUpdater 是一个实用控制台应用程序,适合在构建服务器上使用,它将在 Limyee 电商平台中创建的小组件与 Samples 项目打包为单个可安装的 DLL 进行部署。
Samples 工厂默认小组件提供程序的实现
Samples 工厂默认提供程序是 Limyee 电商平台的插件。它提供了一个容器,用于通过实现 IScriptedContentWidgetFactoryDefaultProvider,可在文件系统上存储出厂默认小组件。它还实现了IInstallablePlugin,以便能够从项目的发布版本的嵌入资源中安装与出厂默认提供程序关联的所有小组件源。
与其回顾所有的源代码,不如让我们回顾一下独特的方法,并讨论为什么它们以这种方式实现。
出厂默认小组件提供程序标识符
// the provider ID should be updated to be unique (with Developer Mode enabled, go to Administration > Development > Generate GUID to get a new GUID) private readonly Guid _providerId = new Guid("BCF00CEE-E850-4DF0-B62B-76D464F13408");
请注意,在 FactoryDefaultWidgetProvder.cs 文件的顶部提及有关更新只读标识符的注释。这是您的实现唯一的标识符。该 Samples 示例没有编译版本的示例实现,因为需要您对它修改和定制生成才能使用。通常,出厂默认小组件提供程序会包含在其他功能中,例如自定义内容类型或自定义小组件扩展。所以,至少应更新此标识符。
开发者模式注意事项
为了更好地支持开发者模式,开发者会在 Limyee 电商平台 UI 中编辑其出厂默认小组件 ,但需要对出厂默认小组件提供程序的实现进行一些考虑。
private Version _emptyVersion = new Version(0, 0, 0, 0); #if DEBUG private Version _version = new Version(0, 0, 0, 0); #else private Version _version = null; #endif
每当插件的版本更改时,都会安装插件,但是,在开发小组件时,您不希望安装任何小组件源文件,因为这些安装的文件会覆盖您的开发版本。为了解释这种功能冲突,我们将使用编译时条件和预设版本。
在使用调试模式编译时,可以启用开发者模式。在这种情况下,插件将始终标识 0.0.0.0 的版本,这也是默认的版本值。当版本设置为 0.0.0.0 时,我们绕过版本确定逻辑:
public Version Version { get { if (_version == null) { // only executed when the version isn't preset to 0.0.0.0 } return _version; } }
并绕过安装过程:
public void Install(Version lastInstalledVersion) { if (Version == _emptyVersion) return; // Normal installation logic... }
这些更改可确保在使用开发者模式时,您不会意外地被以前构建的小组件包版本覆盖我们的小组件源。
支持安装和版本审查
Limyee 电商平台支持审查最终用户对小组件所做的更改。当新版本的出厂默认设置可用时,平台可以对小组件的现有实现进行版本控制(无论是否在升级前自定义),将出厂默认设置的基础版本更新为最新版本,并在升级后提供审核流程,以在预览面板查看或在小组件编辑器中选择加入或查看各个小组件的差异。此示例在 IInstallablePlugin 实现中使用此过程。
在发布版本中,版本将保持未设置状态,直到首次访问:
private Version _emptyVersion = new Version(0, 0, 0, 0); #if DEBUG private Version _version = new Version(0, 0, 0, 0); #else private Version _version = null; #endif
然后,在访问时,我们将根据文件清单中的最大版本确定最新的文件版本(文件清单将在后面介绍,它是应安装的嵌入文件列表):
public Version Version { get { if (_version == null) { Version version = _emptyVersion; foreach(var file in FactoryDefaultWidgetFileManifest.Files().Where(x => x.WidgetProviderId == ScriptedContentFragmentFactoryDefaultIdentifier)) { if (file.LastModifiedVersion > version) version = file.LastModifiedVersion; } _version = version; } return _version; } }
然后,当版本与当前安装的版本不同时(因为这是首次启用此插件或已安装更新),则在 Install 方法中安装嵌入文件:
public void Install(Version lastInstalledVersion) { if (Version == _emptyVersion) return; var files = FactoryDefaultWidgetFileManifest.Files().Where(x => x.WidgetProviderId == ScriptedContentWidgetFactoryDefaultIdentifier).ToList(); DetectedDeletedProviderFiles(files); // detect upgrade changes and version widgets appropriately for post-upgrade review (or just install all of the files if this isn't an upgrade) var message = ContentWidgets.UpdateScriptedContentWidgets( lastInstalledVersion, files.Select(x => x as IInstallableFile).ToList() ); // if this was an upgrade, identify the upgrade as complete and provide a way to review widgets (if any were modified as part of the upgrade) if (lastInstalledVersion > _emptyVersion) { // identify that the plugin was upgraded and provide the note to review widget changes, if there was one Apis.Get<ISystemNotifications>().Create( string.Concat(Name, " Upgraded"), string.Concat("<p>", Name, " has been upgraded to ", Version.ToString(), ".</p>", message ?? "") ); } }
此安装需要几个步骤:
- 加载文件清单。 具体而言,仅检索清单中影响此出厂默认提供程序的文件(如有必要,可以扩展示例,使它支持多个出厂默认提供程序)。
- 确定已删除的文件。 若要查找已删除的文件,我们使用 DetectedDeletedProviderFiles 方法将当前安装的文件列表与文件清单进行比较。假定当前已安装但未在最新清单中的任何文件都将被删除。
- 升级文件。 为此,我们使用修改后的清单(嵌入文件列表与已删除文件列表相结合),并将其提供给 ContentWidgets.UpdateScriptedContentWidgets() UI 自动化 API。此 API 将对已修改的源文件的任何现有实现进行版本控制,然后安装更新的出厂默认文件。发现的任何更改都将以 HTML 格式返回,该方法可提供给站点管理员查看小组件更新以批准或拒绝它们。
- 发送升级消息。 如果插件是升级(而不是初始安装),则使用 ISystemNotifications.Create() API 发送升级系统通知,以通知系统管理员插件已成功升级,如果有任何小组件更改,将提供审阅消息。
出厂默认小组件文件清单更新程序
清单更新程序是一个控制台应用程序,可在打包 Samples 项目在进行部署时使用。控制台应用将更新 Samples 出厂默认小组件提供程序在安装过程使用的文件清单,并确保源文件嵌入到生成的 DLL 中。在发布模式编译 Samples 项目以进行部署之前,应先执行此控制台应用。
使用示例
使用示例进行开发和部署略有不同
使用示例进行开发
将示例合并到项目中
通常,出厂默认小组件提供程序用于公开使用插件实现的其他自定义功能。然后,应将此示例合并到同一项目中,以便将所有组件一起分发。如果此项目仅用于小组件源文件管理,则至少应更新命名空间、项目名称和程序集名称。
更新出厂默认提供程序 ID
项目源位于良好位置后,为出厂默认提供程序标识符生成新的 GUID。不应使用示例中的值。若要在开发者模式下生成 GUID,请转到“管理 >开发 > 生成 GUID”,然后复制生成的 GUID。在 FactoryDefaultWidgetProvider.cs更新_providerId。
更新项目引用
要使用该示例,项目需要引用 Limyee.Components.dll、 Limyee.Core.dll、Limyee.Api.dll 和 Limyee.ScriptedWidgets.dll,所有 DLL 都是 Limyee 电商平台的一部分。
构建和部署
确保在调试模式下编译项目。编译项目并将生成的 DLL 部署到 Limyee 电商平台的开发实例(如果您的开发实例包含该平台的多个实例,请在每个实例中安装 DLL。例如:每个 Web 节点和作业计划程序节点)。
启用插件
在 Limyee 电商平台中,启用插件。转到“管理”并搜索插件的名称(该示例称为“示例小组件”)。单击查看插件,选中启用框,然后保存。
开发小组件
启用开发者模式后,在管理 > 界面 > 小组件工作室,通过点击+图标来创建新的小组件。在“小组件详细信息(开发者模式)”模态中,选择出厂默认提供程序的名称,例如:“示例小组件”:
如果您没有看到示例小组件提供程序,可以转到管理 > 开发 > 终止缓存,然后选择“终止所有缓存”,然后重试。
在“小组件详细信息(开发者模式)”模态上点击“继续”,您在出厂默认提供程序中创建了新的暂存小组件。然后,您可以正常开发小组件。保存时,小组件将保存到您配置的集中文件系统的文件中,默认情况下,在
Web\filestorage\defaultwidgets\{FACTORY_DEFAULT_PROVIDER_ID}
其中 {FACTORY_DEFAULT_PROVIDER_ID} 是您在自定义示例实现时使用的出厂默认提供程序 ID。这是您需要添加到源代码管理的文件夹。此文件夹中的任何文件都是源文件,用于实现与出厂默认设置关联的小组件。在开发小组件时,您需要对所做的任何更改(新文件、已编辑的文件、已删除的文件)提交到此文件夹。
生成部署包
将小组件开发为出厂默认小组件提供程序实现的一部分后,您可以打包插件和小组件源文件以进行部署。为此,
设置编译环境
编译环境不应与开发环境相同。理想情况下,此步骤将作为持续集成过程的一部分执行。也可以在提供程序实现的第二个本地实例中执行它。
获取最新源
从源管理解决方案加载插件源和小组件源的最新实现。这两个源文件集应位于单独的文件夹中(一个不应位于另一个文件夹中)。
执行 FactoryDefaultWidgetFileManfiestUpdater 控制台应用。具体而言,执行:
FactoryDefaultWidgetFileManifestUpdater.exe /proj:"{FULL_PROJECT_PATH}" /providerid:{WIDGET_PROVIDER_ID} /cfs:"{FULL_CFS_PATH}" /out:"{PATH_TO_MANIFEST_CLASS}"
其中替换以下标记:
{FULL_PROJECT_PATH} |
Samples.csproj 项目文件的本地完整路径。 |
{WIDGET_PROVIDER_ID} |
表示 Samples 出厂默认提供程序的 GUID(在 Samples 项目的 FactoryDefaultWidgetProvider.cs 文件中指定)。 |
{FULL_CFS_PATH} |
CFS 根文件夹(例如:Web/filestorage/)的完整本地路径,其中包含此出厂默认提供程序的小组件源。这不应位于 Samples 项目的文件夹中。 |
{PATH_TO_MANIFEST_CLASS} |
在 Samples 项目的 FactoryDefaultWidgetFileManifest.cs 的完整本地路径。 |
生成部署包
确保将示例项目设置为在发布模式下编译项目。生成的 DLL 将包括所有小组件源文件以及清单,并启用小组件源文件安装。现在可以部署此 DLL。
安装部署包
若要安装部署包:
安装程序包 DLL
将生成的部署包 DLL 安装到 Limyee 电商平台的每个实例(每个 Web 和作业服务器节点)中。请注意,不应在开发站点上安装部署包,因为您将覆盖开发中的任何小组件。
启用插件
如果插件尚未启用,请转到“管理”并搜索插件的名称(示例的名称为“示例插件”)来启用它。选择匹配的插件,选中启用它后保存插件。
查看升级说明
如果这是插件的第一次启用,则不会发送任何通知,但小组件将安装并可供使用。
如果插件已更新,则会向站点管理员发送通知:
如果更新包含对小组件的任何更改,则这些小组件将已进行版本控制,并将显示上述示例的审阅文本。单击“查看小组件更新”将启动小组件审核流程,其中列出了已修改的小组件,这些小组件在发布到平台之前可供预览、查看和编辑。