ABP Framework 模块管理
概述
该页面详细介绍了在 ABP Framework 解决方案中使用 ABP CLI 及相关工具添加、更新和管理模块的方法。模块管理是 ABP 模块化架构的核心,支持可重用业务和基础设施功能的集成。模块通常以 NuGet 和/或 NPM 包的形式分发,有时也以源代码形式提供。
ABP CLI 模块管理命令
命令 | 描述 |
---|---|
abp add-module |
向解决方案添加多包模块 |
abp update |
更新模块和 ABP 包版本 |
abp list-modules |
列出可用的官方 ABP 模块 |
模块添加流程
模块添加由 SolutionModuleAdder
类和 abp add-module
命令协调完成,流程如下:
Yes No Yes No abp add-module (AddModuleCommand.ExecuteAsync) SolutionModuleAdder.GetModuleInfoAsync SolutionModuleAdder.RemoveIncompatiblePackages ProjectFinder.GetProjectFiles SolutionModuleAdder.AddNugetAndNpmReferences withSourceCode? SolutionModuleAdder.DownloadSourceCodesToSolutionFolder SolutionModuleAdder.AddAngularPackages SolutionModuleAdder.RemoveUnnecessaryProjectsAsync addSourceCodeToSolutionFile? SolutionFileModifier.AddModuleToSolutionFileAsync NugetPackageToLocalReferenceConverter.Convert SolutionModuleAdder.AddAngularSourceCode SolutionModuleAdder.RunBundleForBlazorAsync SolutionModuleAdder.ModifyDocContent Module added
abp add-module
命令
-
语法 :
abp add-module <module-name> [options]
-
关键选项:
--new
:创建专用于解决方案的新模块--with-source-code
:下载模块源代码到解决方案--add-to-solution-file
:将下载的模块添加到解决方案文件-s, --solution
:明确指定解决方案文件--skip-db-migrations
:跳过数据库迁移创建-v, --version
:指定模块版本(默认为项目的 ABP 版本)
-
示例:
abp add-module Volo.Blogging # 向当前解决方案添加 Blogging 模块 abp add-module Volo.Blogging -s Acme.BookStore # 向指定解决方案添加模块 abp add-module ProductManagement --new # 创建名为 ProductManagement 的新模块
模块结构与目标项目解析
添加模块时,ABP 基于 NuGetPackageTarget
和项目命名约定确定解决方案中哪些项目应接收每个包:
NugetPackageInfo.Target=Application *.Application.csproj NugetPackageInfo.Target=ApplicationContracts *.Application.Contracts.csproj NugetPackageInfo.Target=Domain *.Domain.csproj NugetPackageInfo.Target=DomainShared *.Domain.Shared.csproj NugetPackageInfo.Target=HttpApi *.HttpApi.csproj NugetPackageInfo.Target=HttpApiClient *.HttpApi.Client.csproj NugetPackageInfo.Target=EntityFrameworkCore *.EntityFrameworkCore.csproj NugetPackageInfo.Target=MongoDB *.MongoDB.csproj NugetPackageInfo.Target=Blazor *.Blazor.csproj NugetPackageInfo.Target=Web *.Web.csproj
目标解析逻辑
ProjectFinder.FindNuGetTargetProjectFile
方法用于解析哪个项目接收每个包:
Yes No NugetPackageInfo.Target ProjectFinder.FindNuGetTargetProjectFile Project file exists? Add package reference Skip package
例如,目标为 EntityFrameworkCore
的包会映射到以 .EntityFrameworkCore.csproj
结尾的项目。
添加带源代码的模块
使用 --with-source-code
或 --new
选项时,模块源代码会下载到 /modules
文件夹并设置项目引用:
Yes No abp add-module --with-source-code SolutionModuleAdder.DownloadSourceCodesToSolutionFolder SolutionModuleAdder.RemoveUnnecessaryProjectsAsync NugetPackageToLocalReferenceConverter.Convert addSourceCodeToSolutionFile? SolutionFileModifier.AddModuleToSolutionFileAsync End
此方法推荐用于:
- 自定义或扩展模块代码
- 调试模块内部
- 审查模块实现
数据库集成
如果添加的模块包含实体,ABP 会:
- 定位应用程序的
DbContext
- 向
DbContext
添加模块的配置方法 - 创建新的 EF Core 迁移(除非跳过)
- 运行迁移程序项目(如果可用)
No Yes Yes No Module added module.EfCoreConfigureMethodName exists? End DerivedClassFinder.Find(dbMigrationsProject, 'AbpDbContext') DbContextFileBuilderConfigureAdder.Add skipDbMigrations? EfCoreMigrationManager.AddMigration SolutionModuleAdder.RunMigrator
创建数据库迁移
模块添加器将:
- 在应用程序中找到 DbContext
- 使用模块的
Configure{ModuleName}
方法添加必要的实体配置 - 创建名为
Added_{ModuleName}_Module
的新迁移 - 运行迁移程序(如果可用)
客户端集成
模块可能包含用于 Angular、Blazor 或 MVC 的客户端包,模块添加器会自动集成它们:
Found Not found Found Not found Detect Angular NPM packages ProjectNpmPackageAdder.AddNpmPackageAsync Skip SolutionModuleAdder.TryConfigureModuleConfigurationsForAngular Detect Blazor NuGet packages ProjectNugetPackageAdder.AddAsync Skip SolutionModuleAdder.RunBundleForBlazorAsync
Angular 集成
包括:
- 安装 NPM 包(
ProjectNpmPackageAdder.AddNpmPackageAsync
) - 修改
app.module.ts
和app-routing.module.ts
以注册模块(SolutionModuleAdder.TryConfigureModuleConfigurationsForAngular
) - 按需添加源代码
Blazor 集成
包括:
- 将 NuGet 包添加到 Blazor 项目
- 运行捆绑命令生成静态资源(
SolutionModuleAdder.RunBundleForBlazorAsync
)
更新模块
要更新解决方案中所有与 ABP 相关的 NuGet 和 NPM 包,请使用:
abp update
更新流程
abp update (UpdateCommand.ExecuteAsync) Find .sln files For each solution VoloNugetPackagesVersionUpdater.UpdateSolutionAsync NpmPackagesUpdater.Update Done
选项
选项 | 描述 |
---|---|
--npm |
仅更新 NPM 包 |
--nuget |
仅更新 NuGet 包 |
--check-all |
单独检查每个包版本 |
-v, --version |
更新到特定版本 |