文章系列



目錄



安裝器實做

在上一篇文章中有介紹手動與本地自動安裝的流程,除此之外還有第三種就是透過安裝器,它的特點就是透過一個獨立的 Installer 將建立好的 abppkgabpmdl 文件打包成 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