🧱 分层架构
Composer Skills 的三层不是"装饰性"的分层 —— 每层有清晰的依赖方向:应用层 → SDK 层 → 基础层,且下层永不反向依赖上层。
🧱 基础层
基础层是整个项目的地基,包含四个互不耦合业务的包。
📦 pkg/domain
纯数据模型包,定义 Package、Advisory、Statistics、Version 等结构体。不依赖项目内任何其他包,是 SDK 层共享类型的"中立区"。
🔍 pkg/detector
跨操作系统检测 Composer 是否已安装,支持 Windows / macOS / Linux 多种安装方式(brew、apt、phar、可执行文件)。依赖关系:无内部依赖,仅依赖标准库。
⚙️ pkg/installer
当 Composer 缺失时自动安装,并可顺带安装 PHP。智能识别操作系统选择 brew、apt 或直接下载 phar。
- 暴露接口:
installer.NewInstaller(config)、inst.Install() - 依赖:
pkg/detector(先检测再决定安装)、pkg/composerutils(文件系统/HTTP 下载)、pkg/composerutils/mock(测试)
🛠️ pkg/composerutils
共享工具集,包含文件系统操作(fs.go)、HTTP 下载(http.go)、Mock 执行器(mock/mock.go)与测试辅助(test_utils.go)。是被installer 复用的"瑞士军刀"。
🔌 SDK 层
SDK 层把两类外部系统封装成类型化的 Go API。
⌨️ pkg/composer(CLI 封装)
封装本地 composer 二进制,提供 234 个方法,分 20 个分类。
- 暴露接口:
composer.New(opts)、comp.SetWorkingDir()、comp.AuditWithJSON()等 - 依赖:
pkg/detector(启动时检测)、pkg/installer(AutoInstall: true时自动安装缺失的 Composer) - 测试:通过
SetupMockOutput注入伪命令输出,不真实执行 composer
🌐 pkg/client + pkg/repository(Packagist API)
纯 Go 的 HTTP 客户端,无需 PHP。
pkg/client:20 个方法(搜索、统计、安全公告),依赖pkg/domain作为返回类型pkg/repository:仓库操作层,同样依赖pkg/domain
🖥️ 应用层
💻 cmd/composer-skills
基于 Cobra 的 CLI 工具,50+ 子命令。依赖 pkg/composer、pkg/client、pkg/domain 三个包,把 SDK 能力暴露到终端。
📚 docs
VitePress 文档站与渐进式披露指南(docs/skills/)。
依赖方向一览
依赖箭头严格自上而下:应用层 → SDK 层 → 基础层。
关键约束
基础层绝不反向 import SDK 层或应用层。这条规则保证了基础层可被任意上层复用、可独立测试。
详细 import 关系
完整的包间 import 关系见 包依赖关系。