Skip to content

🧱 分层架构

Composer Skills 的三层不是"装饰性"的分层 —— 每层有清晰的依赖方向:应用层 → SDK 层 → 基础层,且下层永不反向依赖上层。

🧱 基础层

基础层是整个项目的地基,包含四个互不耦合业务的包。

📦 pkg/domain

纯数据模型包,定义 PackageAdvisoryStatisticsVersion 等结构体。不依赖项目内任何其他包,是 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/installerAutoInstall: 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/composerpkg/clientpkg/domain 三个包,把 SDK 能力暴露到终端。

📚 docs

VitePress 文档站与渐进式披露指南(docs/skills/)。

依赖方向一览

依赖箭头严格自上而下:应用层 → SDK 层 → 基础层。

关键约束

基础层绝不反向 import SDK 层或应用层。这条规则保证了基础层可被任意上层复用、可独立测试。

详细 import 关系

完整的包间 import 关系见 包依赖关系

基于 MIT 许可证发布