Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 新的插件结构和加载逻辑, 插件项目模板 #18

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

Saplonily
Copy link
Member

@Saplonily Saplonily commented Dec 29, 2024

旧说明

现在所有在 Plugins 的插件可以有两种形式, 一种是没有外部依赖的"裸" dll, 会被直接加载, 另一种是打包后的插件, 遵循以下结构:

  • 任意文件名.zip
    • Libraries
      • FSharp.Core.dll
      • zh-Hans
        • FSharp.Core.resources.dll
      • Some.Other.Libraries.dll
    • MyPlugin.dll
    • MyPlugin.pdb

是的还支持了 .NET 本体的附属程序集, 但是整个项目被改的很看不下去, 在考虑是不是真的需要支持附属程序集
最顶层只能放置插件的程序集以及符号文件, 以及 Libraries 目录, 任何插件尝试加载的程序集都会在这里寻找, Libraries/zh-Hans 这种更深层的附属程序集的目录也会被在尝试加载附属程序集时寻找(使用的 Culture 是 CurrentUICulture, 和 ResourceManager 使用的默认 Culture 一致, 或许应该考虑和 I18N service 的一致?).

此外新增 PluginTypeAttribute, 应用在程序集上, 来指定该程序集的 Plugin 类, 如果没有找到的话会 fallback 到搜索整个程序集.

有关模板, 新增了一个 CurvaLauncher.PluginTemplate 目录放置模板项目, 可以在 src 目录下使用 dotnet new install CurvaLauncher.PluginTemplate 安装, 然后使用类似下面的命令行:

dotnet new curvaplugin -n "MySuperCurvaPlugin"
dotnet new curvaplugin -clproj ../CurvaLauncher
dotnet new curvaplugin -clpath ../CurvaLauncher/build

clprojclpath 都会更改生成的 .csproj 里的两个目录 CurvaLauncherProject, CurvaLauncherPath, 前者用来指定 CurvaLauncher 项目源代码位置(用来引用 Plugins 项目, 有更优雅的做法吗(?)), 后者用来指定 CurvaLauncher 编译产物的位置(用来在编译完后复制项目编译后的文件到 Plugins 文件夹内)
模板生成的项目在编译后会执行一个 msbuild task 将所有编译产物调整至上面 zip 的结构然后打包成 zip 复制到程序的 Plugins 文件夹内.
此外还附带一个 publishToZip.ps1 脚本, 它会将项目编译完后的 .zip 放置到项目根目录用来分发.
大概就这些了, 但是感觉要改的地方好多

breaking change 地修改了加载逻辑, 除了和之前兼容的"裸 dll"加载方法, 现在对于 zip 插件加载, zip 可有如下结构:

  • 任意文件名.zip
    • Manifest.json
    • MyPlugin.dll
    • MyPlugin.pdb
    • MyPlugin.deps.json
    • xxx.dll
    • runtimes
      • win-x64
        • native
          • nativelib.dll
    • zh-Hans
      • FSharp.Core.resources.dll

其中 Manifest.json 结构:

{
  "ID": "SHLoadIndirectStringList",
  "Assembly": "CurvaLauncher.Plugins.SHLoadIndirectStringList.dll"
}
  • ID 作为保留字段(目前插件似乎都没有一个类似 id 的东西来着), 可能未来在支持插件见引用时有用(真的会有支持这个的时候吗(x))
  • Assembly 指示插件主程序集的名字
    所有 runtimes(包括本机库), zh-Hans(附属程序集) 会使用 MyPlugin.deps.json 进行 probe, 所以如果需要额外的平台库或者附属程序集正常加载的话需要正确添加 .deps.json 文件(通过设置 GenerateDependencyFiletrue)
    此外新增 PluginTypeAttribute, 应用在程序集上, 来指定该程序集的 Plugin 类, 如果没有找到的话会 fallback 到搜索整个程序集.

模板位于 Template 文件夹中作为一个独立的 CurvaLauncher.PluginTemplate.csproj 项目, 可以通过 dotnet pack 后得到的 nuget 包使用类似于 dotnet new install CurvaLauncher.PluginTemplate.0.7.1-beta.nupkg 安装, 或者发布到 nuget.org 上后直接使用类似 dotnet new install CurvaLauncher.PluginTemplate 安装.
然后可以用类似下面的命令行创建项目:

# 创建一个名字为 MySuperCurvaPlugin 的插件
dotnet new curvaplugin -n "MySuperCurvaPlugin"
# 创建并指定 CurvaLauncher 可执行文件的目录位置
dotnet new curvaplugin -clpath ../CurvaLauncher/build

如果 clpath 被正确指定了的话, 在项目构建完成时 msbuild 会将编译输出打包复制到 CurvaLauncher 的 Plugins 目录下.
可通过 NoZipOutputPlugin 设置为 true 关闭.
此外也还附带一个 publishToZip.ps1, 会将项目以 Release 配置编译后就地打包一个 zip 以便发布.
大概就这些了, 另外测试时出现了大量 bug, 现在生怕有漏网之鱼

@Saplonily Saplonily marked this pull request as draft December 31, 2024 04:44
@Saplonily
Copy link
Member Author

🤔考虑还要支持本机库的加载, 暂时先改成 draft

@Saplonily Saplonily marked this pull request as ready for review January 23, 2025 12:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant