应定义为"type": "library",因其仅提供可复用客户端类和简单配置,无需插件机制;require仅含真实运行时依赖,autoload用psr-4映射src/,不包含serviceprovider、命令或视图等冗余内容。

轻量级第三方接口扩展包,核心目标是「能装、能用、不污染」——不需要插件机制,不改 Composer 行为,只提供可复用的客户端类和简单配置。它本质就是一个 type: "library" 包,不是 composer-plugin。
怎么定义 composer.json 才算真正轻量
关键在三点:类型明确、依赖克制、自动加载干净。
-
type必须设为"library"(不是"composer-plugin",后者会触发插件加载逻辑,完全没必要) -
require只写真实运行时依赖,比如调用微信 API 就只加"guzzlehttp/guzzle": "^7.5";避免引入框架(如laravel/framework)或全量 SDK -
autoload用psr-4映射到src/,命名空间建议用小写 vendor + package,例如"WxClient\": "src/",避免带WxClientSDK这类冗余层级 - 不要加
extra.class,那是插件才需要的;也不要 requirecomposer-plugin-api
src/ 下放什么代码才够轻
一个典型结构只需三样东西:客户端主类、异常类、可选的配置类。不放 ServiceProvider、不放命令、不放视图或迁移。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 主类命名直接体现用途,比如
WxClient或AliyunOssClient,构造函数接收配置数组或array $config,不强绑 DI 容器 - 所有 HTTP 调用统一走一个私有方法(如
request()),内部用GuzzleHttpClient或原生cURL,不暴露底层细节 - 异常统一继承
Exception,不依赖框架异常基类;错误码、消息、原始响应体都可通过 getter 拿到 - 如果需要签名或 token 刷新逻辑,封装成 protected 方法,不暴露给使用者
为什么不能直接 require dev 依赖来测试
本地开发时容易把 phpunit、mockery 写进 require,这会让最终用户也安装测试工具——既增大体积,又可能引发冲突。
- 测试依赖必须放在
require-dev,且autoload-dev只映射测试目录(如"tests/": "tests/") - 发布前执行
composer install --no-dev验证生产环境是否能正常加载和实例化类 - Packagist 不读取
require-dev,所以不用担心它影响下游项目 - 如果你用了
__DIR__ . '/../vendor/autoload.php'在测试中,上线后这个路径会失效——正确做法是让使用者通过 Composer 自动加载
发布后别人怎么安全地用你的包
最常被忽略的是版本约束和稳定性标记。很多人发完 v1.0.0 后继续往 dev-main 提交,却不打新 tag,导致下游 "your/name": "^1.0" 拉到不可控的变更。
- 首次发布务必打语义化版本 tag,如
v1.0.0,并确保composer.json的version字段与之匹配(虽然 Packagist 以 git tag 为准,但写上更清晰) - 在
composer.json中显式声明"minimum-stability": "stable",避免别人require时意外拉到dev分支 - 别把 GitHub 私有仓库地址直接写死在
repositories里——那是使用者该配的,你的包里只管声明依赖,不干涉宿主环境 - README 中给出最简使用示例:new 一个实例 → 调一个方法 → 拿到结果,不夹杂 Laravel 或 ThinkPHP 特定语法
真正的轻量,不在于代码行数少,而在于边界清晰:它只解决一个接口调用问题,不越界处理配置分发、命令注册或事件监听。一旦开始往里塞 ServiceProvider 或监听 post-install-cmd,它就不再是“扩展包”,而是“插件”了。










