Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ dotnet build build/PluginBundle.proj -c Release -t:PackAllVpx -p:VelaSigningKey=
各插件的设计取证也在 velashell-docs:Redis 见
[`zh/host/Redis客户端插件化调研与设计.md`](https://github.com/VelaShellLabs/velashell-docs/blob/main/zh/host/Redis客户端插件化调研与设计.md),
S3 见 [`zh/host/S3协议插件化设计.md`](https://github.com/VelaShellLabs/velashell-docs/blob/main/zh/host/S3协议插件化设计.md),
Telnet / 串口见 [`zh/host/Telnet与串口可行性调研.md`](https://github.com/VelaShellLabs/velashell-docs/blob/main/zh/host/Telnet与串口可行性调研.md)。
Telnet / 串口见 [`zh/host/Telnet与串口可行性调研.md`](https://github.com/VelaShellLabs/velashell-docs/blob/main/zh/host/Telnet与串口可行性调研.md),
MongoDB 见 [`zh/host/MongoDB工作台插件设计.md`](https://github.com/VelaShellLabs/velashell-docs/blob/main/zh/host/MongoDB工作台插件设计.md)。
**改了这些插件的设计取舍,要回写对应那篇。**

Docker 面板是个例外:它从独立仓库 `VelaShell.Plugin.DockerPanel` 并进来(2026-09-11),
Expand Down
20 changes: 15 additions & 5 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project>
<!--
中央包版本管理(CPM)。本仓库所有工程的 NuGet 版本号只在这一处出现 ——
五个插件 + 五个测试工程,谁也不许在 csproj 里写 Version=。
六个插件 + 六个测试工程,谁也不许在 csproj 里写 Version=。

为什么值得:插件之间会共用同一个包(AWSSDK.S3 在 S3 插件与它的测试里各一份、
Avalonia 在测试工程里五处),版本散在各 csproj 时"改了一处忘了另一处"没有任何
Expand All @@ -17,9 +17,9 @@
<!-- 插件工程只需要这一个包:契约程序集、与宿主版本一致的 Avalonia(含 AXAML 编译器)、
plugin.json 处理、清单编译期校验与 `dotnet build -t:PackVpx` 都随它到位。
所以下面**没有** Avalonia 的条目给插件用 —— 插件不该自己声明 Avalonia。 -->
<PackageVersion Include="VelaShell.PluginSdk.Build" Version="2.0.6" />
<PackageVersion Include="VelaShell.PluginSdk.Build" Version="2.0.8" />
<!-- 测试替身:TestPluginContext 与各能力的内存实现,不起宿主即可测插件逻辑。 -->
<PackageVersion Include="VelaShell.PluginSdk.Testing" Version="2.0.6" />
<PackageVersion Include="VelaShell.PluginSdk.Testing" Version="2.0.8" />
</ItemGroup>
<ItemGroup Label="Avalonia(仅测试工程用:测试宿主扮演装载方,要提供运行时那份)">
<!-- ⚠️ 必须与 VelaShell.PluginSdk.Build 锁给插件工程的那一版**完全相同** ——
Expand All @@ -30,19 +30,29 @@
<PackageVersion Include="Avalonia.Headless" Version="12.1.3" />
<!-- 菜单等控件的模板由主题提供:没有它 MenuItem 无模板、不可命中,真实点击测不了。 -->
<PackageVersion Include="Avalonia.Themes.Fluent" Version="12.1.3" />
<!-- 真渲染(Skia)的 headless 截图:MongoDB 插件的界面回归要拿像素和设计稿比,
UseHeadlessDrawing 那条假绘制路径给不出位图。同样只服务于测试工程,版本随上面三个一起走。 -->
<PackageVersion Include="Avalonia.Skia" Version="12.1.3" />
</ItemGroup>
<ItemGroup Label="Docker 面板插件">
<ItemGroup Label="Docker 面板与 MongoDB 插件">
<!-- MIT。**只在编译期** —— 程序集名 AvaloniaEdit 命中装载器的 "Avalonia" 前缀,
运行时一律回落到宿主那份,因此版本必须与宿主一致。权威值同样来自 SDK 包
(VelaSdkPinnedAvaloniaEditVersion),由 Directory.Build.targets 的
VerifyAvaloniaEditMatchesSdk 在构建期核对(VELAP1001)。
漂了**在本仓库一个测试都不会红**:要等用户装上插件、打开一个 compose.yaml 才炸。 -->
漂了**在本仓库一个测试都不会红**:要等用户装上插件、打开一个 compose.yaml 才炸。
MongoDB 插件的查询编辑器 / JSON 视图同样只在编译期引它;它的测试工程要自己带运行时那份(测试宿主扮演装载方)。 -->
<PackageVersion Include="Avalonia.AvaloniaEdit" Version="12.0.0" />
</ItemGroup>
<ItemGroup Label="Redis 插件">
<!-- MIT,与本仓库 AGPL-3.0 + 商业双许可相容。随插件目录分发。 -->
<PackageVersion Include="StackExchange.Redis" Version="3.3.1" />
</ItemGroup>
<ItemGroup Label="MongoDB 插件">
<!-- Apache-2.0,与本仓库 AGPL-3.0 + 商业双许可相容。随插件目录分发(连同它带的
MongoDB.Bson / DnsClient / SharpCompress / Snappier / ZstdSharp)。
测试工程也引它:种数据与清理走同一个驱动,版本集中管才不会两边各说各话。 -->
<PackageVersion Include="MongoDB.Driver" Version="3.12.0" />
</ItemGroup>
<ItemGroup Label="S3 插件">
<!-- Apache-2.0,与本仓库 AGPL-3.0 + 商业双许可相容。随插件目录分发。
测试工程也要引它(环回服务器要按收到的原始请求行重算 SigV4),
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
> 当前版本 **2.0.3** · SDK **2.0.0**

[VelaShell](https://github.com/joesdu/VelaShell) 官方维护的插件,一个解决方案管起来:
Redis、S3、Telnet、串口、Docker 面板。
Redis、MongoDB、S3、Telnet、串口、Docker 面板。

三个仓库各管一摊,别串:

Expand All @@ -28,7 +28,7 @@ Redis、S3、Telnet、串口、Docker 面板。

| 目录 | 内容 |
| --- | --- |
| `plugins/` | 五个插件,一个子目录一个 csproj(见 [plugins/README.md](plugins/README.md)) |
| `plugins/` | 六个插件,一个子目录一个 csproj(见 [plugins/README.md](plugins/README.md)) |
| `tests/` | 每个插件一个测试工程(MSTest + `VelaShell.PluginSdk.Testing` 替身) |
| `build/PluginBundle.proj` | 批量出 `.vpx`;并把可分发插件收成 `plugins/` 布局(只用于 CI 体检) |
| `scripts/Set-Version.ps1` | 把发行版本号写进仓库里所有落点(发版时由流水线自动跑) |
Expand Down
2 changes: 2 additions & 0 deletions VelaShell.Plugins.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<File Path="plugins/Directory.Build.targets" />
<File Path="plugins/README.md" />
<Project Path="plugins/VelaShell.Plugin.DockerPanel/VelaShell.Plugin.DockerPanel.csproj" />
<Project Path="plugins/VelaShell.Plugin.Mongo/VelaShell.Plugin.Mongo.csproj" />
<Project Path="plugins/VelaShell.Plugin.Redis/VelaShell.Plugin.Redis.csproj" />
<Project Path="plugins/VelaShell.Plugin.S3/VelaShell.Plugin.S3.csproj" />
<Project Path="plugins/VelaShell.Plugin.Serial/VelaShell.Plugin.Serial.csproj" />
Expand All @@ -31,6 +32,7 @@
<File Path="tests/Directory.Build.targets" />
<File Path="tests/velashell.runsettings" />
<Project Path="tests/VelaShell.Plugin.DockerPanel.Tests/VelaShell.Plugin.DockerPanel.Tests.csproj" />
<Project Path="tests/VelaShell.Plugin.Mongo.Tests/VelaShell.Plugin.Mongo.Tests.csproj" />
<Project Path="tests/VelaShell.Plugin.Redis.Tests/VelaShell.Plugin.Redis.Tests.csproj" />
<Project Path="tests/VelaShell.Plugin.S3.Tests/VelaShell.Plugin.S3.Tests.csproj" />
<Project Path="tests/VelaShell.Plugin.Serial.Tests/VelaShell.Plugin.Serial.Tests.csproj" />
Expand Down
9 changes: 5 additions & 4 deletions plugins/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@ SDK 契约与开发文档在工具链仓库
| 目录 | id | 随包分发 | 装载模式 | 说明 |
| --- | --- | --- | --- | --- |
| [VelaShell.Plugin.DockerPanel](VelaShell.Plugin.DockerPanel/) | `velashell.dockerpanel` | 是 | 进程内 | 远端 Docker 管理面板:容器 / 镜像 / 卷 / 网络 / Compose,含实时统计、日志、容器内文件编辑与内置终端 |
| [VelaShell.Plugin.Mongo](VelaShell.Plugin.Mongo/) | `velashell.mongo` | 是 | 进程内 | MongoDB 工作台:Navicat 式对象树与工具栏、网格 / 树 / JSON 三视图与暂存区编辑、查询编辑器与可视化执行计划、聚合管道构建器、Schema 分析与验证规则、索引建议、GridFS、服务器监控、慢查询、用户与角色、导入 / 导出 / 数据传输 |
| [VelaShell.Plugin.Redis](VelaShell.Plugin.Redis/) | `velashell.redis` | 是 | 进程内 | Redis 客户端:键浏览、类型化查看与编辑、命令执行 |
| [VelaShell.Plugin.S3](VelaShell.Plugin.S3/) | `velashell.s3` | 是 | 进程内 | S3 兼容对象存储:协议 + 桶管理器 + 对象检视器(协议能力域的首个使用者) |
| [VelaShell.Plugin.Serial](VelaShell.Plugin.Serial/) | `velashell.serial` | 是 | 进程内 | RS-232 / USB 转串口终端:端口热插拔枚举、换行归一化、发送节流、Break 与 DTR/RTS |
| [VelaShell.Plugin.Telnet](VelaShell.Plugin.Telnet/) | `velashell.telnet` | 是 | 进程内 | RFC 854 Telnet 终端:选项协商 + NAWS + 8 位透明(**终端**协议能力的首个使用者) |

装载模式由 `plugin.json` 的 `hostMode` 决定(`isolated` / `inProcess`,默认进程内)。
隔离插件跑在独立的 `VelaShell.PluginHost` 进程里(实现在主仓库),崩溃不波及宿主;
S3 与 Redis 因为**协议能力只在进程内可用**必须进程内装载 —— 协议是宿主反向调用插件的
S3 与 Redis 因为**协议能力只在进程内可用**必须进程内装载(MongoDB 与 Docker 面板同理:面板要把原生控件挂进主窗口的文档区) —— 协议是宿主反向调用插件的
高频通道,隔离进程的 RPC 只承载插件→宿主方向(清单校验会直接拒绝 protocols + isolated 的组合);
Telnet 与串口同理。Docker 面板的理由是另一条:它要把一个原生 Avalonia 控件挂进主窗口标签区
(控件无法跨进程嵌入),而且 `IRemoteTunnelApi` 交给它的是一条**活的 `Stream`**,
Expand Down Expand Up @@ -72,9 +73,9 @@ Telnet 与串口同理。Docker 面板的理由是另一条:它要把一个原
### 例外:确实需要某个 `Avalonia.*` 包时,`ExcludeAssets="runtime"` 必须自己写

上一段那条"不要写 `ExcludeAssets`"的前提是**插件不直接引 Avalonia 包** ——
前四个插件都不引,SDK 包处理它自己那条引用就够了。
Redis、S3、Telnet、串口这四个插件都不引,SDK 包处理它自己那条引用就够了。

DockerPanel 要 `Avalonia.AvaloniaEdit` 做语法高亮,于是撞上了另一面:
DockerPanel 与 MongoDB 都要 `Avalonia.AvaloniaEdit`(compose.yaml 高亮;查询编辑器 / JSON 视图 / 管道阶段的高亮、补全与诊断),于是撞上了另一面:
`VelaExcludeSharedRuntimeAssets` 排得掉 `Avalonia.AvaloniaEdit` 自己的运行时资产,
**排不掉它带进来的传递依赖**。去掉那条 `ExcludeAssets`,
`AvaloniaEdit → Avalonia → MicroCom.Runtime` 里的 `MicroCom.Runtime.dll`
Expand All @@ -98,7 +99,7 @@ CI 那条泄漏体检原本也只认 `Avalonia*` 与 `VelaShell.PluginSdk.dll`
"随包分发"由 csproj 的 `<VelaPluginShip>` 控制(默认 `true`)。设成 `false` 的插件
本机构建仍会镜像到 `artifacts/plugins/`(以及 `VELASHELL_DEV_APP_DIR` 指定的应用目录),
装载起来验证插件系统没问题,但它不会被收进分发布局 —— 给开发者读的范例用这一档。
(当前五个插件都是 `true`;示例插件 HelloWorld 已于 2026-08 移除。)
(当前六个插件都是 `true`;示例插件 HelloWorld 已于 2026-08 移除。)

[`build/PluginBundle.proj`](../build/PluginBundle.proj) 的 `Bundle` 目标把 `VelaPluginShip=true`
的插件收成安装包 `plugins/` 那一层的布局:它不再作为 Release 资产上传,只在 CI 与发布流水线里
Expand Down
Loading