文章系列
- 01.模組化架構入門:設計與實踐 - Part 1
- 02.模組化架構入門:領域層級 - Part 2
- 03.模組化架構入門:基礎設施層 - Part 3
- 04.模組化架構入門:應用層與 HTTP 層 - Part 4
- 05.模組化架構入門:Host 層 - Part 5
- 06.模組化架構入門:Http Client - Part 6
- 07.模組化架構入門:安裝模組 - Part 7
- 08.模組化架構入門:發佈與安裝器 - Part 8
目錄
安裝器實做
在上一篇文章中有介紹手動與本地自動安裝的流程,除此之外還有第三種就是透過安裝器,它的特點就是透過一個獨立的
Installer 將建立好的 abppkg 與 abpmdl 文件打包成 Installer.nupkg 檔案並上傳到 Nuget。
之後透過命令 abp install-module,ABP 背後會去 Nuget 下載回 Installer.nupkg,並根據內部的 abpmdl 並下載所有依賴的函式庫,
最後再根據函式庫內 abppkg 定義的角色決定安裝流程。
首先建立新專案 BookStoreScratch.Installer
dotnet new classlib -o src/BookStoreScratch.Installer
dotnet sln add src/BookStoreScratch.Installer
mkdir src/BookStoreScratch.Installer/BookStoreScratch
rm src/BookStoreScratch.Installer/Class1.cs
touch src/BookStoreScratch.Installer/BookStoreScratch/BookStoreScratchInstallerModule.cs
調整專案設定檔,確定 abpmdl 與所有 abppkg 都嵌入在內,最後 ABP 透過 dll 加載,因此需要安裝 Volo.Abp.VirtualFileSystem。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.VirtualFileSystem" Version="9.0.2" />
</ItemGroup>
<ItemGroup>
<!-- Embed module definition file -->
<Content Include="..\..\BookStoreScratch.abpmdl">
<Pack>true</Pack>
<PackagePath>content\</PackagePath>
</Content>
<!-- Embed package definition files -->
<Content Include="..\..\**\*.abppkg*">
<Pack>true</Pack>
<PackagePath>content\</PackagePath>
</Content>
</ItemGroup>
</Project>
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
namespace BookStoreScratch;
[DependsOn(typeof(AbpVirtualFileSystemModule))]
public class BookStoreScratchInstallerModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<BookStoreScratchInstallerModule>();
});
}
}
發佈模組
接下來處理模組的發佈流程,最常見的就是直接發佈到 Nuget 上,將模組內必要的組件都打包到 nupkgs 底下。
dotnet pack src/BookStoreScratch.Application/BookStoreScratch.Application.csproj -c Release -o ./nupkgs
dotnet pack src/BookStoreScratch.Application.Contracts/BookStoreScratch.Application.Contracts.csproj -c Release -o ./nupkgs
dotnet pack src/BookStoreScratch.Domain/BookStoreScratch.Domain.csproj -c Release -o ./nupkgs
dotnet pack src/BookStoreScratch.Domain.Shared/BookStoreScratch.Domain.Shared.csproj -c Release -o ./nupkgs
dotnet pack src/BookStoreScratch.EntityFrameworkCore/BookStoreScratch.EntityFrameworkCore.csproj -c Release -o ./nupkgs
dotnet pack src/BookStoreScratch.HttpApi/BookStoreScratch.HttpApi.csproj -c Release -o ./nupkgs
dotnet pack src/BookStoreScratch.HttpApi.Client/BookStoreScratch.HttpApi.Client.csproj -c Release -o ./nupkgs
dotnet pack src/BookStoreScratch.Installer/BookStoreScratch.Installer.csproj -c Release -o ./nupkgs
將 nupkgs 底下所有檔案都推送到 nuget 上,注意要帶入自己的 api-key
for f in *.nupkg; do dotnet nuget push "$f" --api-key <api-key> --source https://api.nuget.org/v3/index.json; done
完成後等待一段時間,確認所有組件都在 Published 就成功了。
安裝 Nuget 上的模組
安裝官方模組只需要透過 abp install-module 即可,但是它只支援官方定義過的模組,所以我們這種第三方的模組需要多幾個額外步驟。
首先要使用命令新增模組來源。
abp add-module-source -n "MyRepo" -p "E:\Project\BookStoreScratch\BookStoreScratch\modules.json"
{
"name": "My Source Modules",
"modules": {
"BookStoreScratch": {
"name": "BookStoreScratch",
"description": "自定義書店模組"
}
}
}
接下來就能在 abp list-modules 看到新的模組出現,背後是根據 NuGet.Config 的順序執行查詢
$ abp list-modules
Checking extensions...
...
> Volo.CmsKit
> Volo.Docs
> BookStoreScratch
最後建立測試專案
abp new Acme.UniStore -dbms PostgreSQL --skip-migrations
改用 install-module 命令,ABP 會自動搜尋 BookStoreScratch.Installer 是否存在。
abp install-module BookStoreScratch
執行完後會發現所有添加參考與添加 DependsOn 的工作全部都自動處理了。
今天的進度 Github