开发composer扩展包需严格配置composer.json的name、autoload、type三项:name须为vendor/package-name格式;autoload推荐psr-4并正确映射命名空间与src路径;type按用途设为library、laravel-package或yii2-extension;本地测试应使用path仓库而非远程require;还需显式声明php及框架版本约束,并验证autoload是否生效。

开发 Composer 扩展包不是“写完代码再打包”,而是从 composer.json 结构、自动加载约定、依赖声明到本地验证,每一步都直接影响别人能否 require 成功、use 正常、autoload 不报错。
初始化 composer.json 必须填对这三项
很多人用 composer init 一路回车,结果包名不合法、命名空间错位、自动加载失效。关键字段只有三个必须手动确认:
-
"name":格式必须是vendor/package-name(全小写、用短横线),比如linxi/exception-helper;错写成LinXi/ExceptionHelper或带下划线,Packagist 会拒绝收录 -
"autoload":强烈建议只用psr-4,且映射路径末尾带反斜杠,例如"Linxi\ExceptionHelper\": "src/"—— 少了\或写成/,use LinxiExceptionHelperHandler就会找不到类 -
"type":如果是通用库填library;如果是 Laravel 包,可填laravel-package(触发自动发现);Yii 2 扩展建议填yii2-extension(虽非强制,但利于生态识别)
本地测试不能靠 composer require 直接装
刚写完代码就 push 到 GitHub,然后在测试项目里 composer require vendor/name:dev-main?大概率失败。原因很实际:
- Packagist 同步有延迟,新包 URL 提交后可能要几分钟才可解析
- 你改了
composer.json但没 push tag,dev-main可能指向旧 commit - 更稳妥的做法是用
path仓库:在测试项目的composer.json里加一段
"repositories": [
{
"type": "path",
"url": "../your-package-directory"
}
]
然后运行 composer require vendor/name:dev-main —— Composer 会直接软链接本地目录,改代码立刻生效,不用反复 push/pull。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
依赖声明别漏掉 php 和框架约束
你的扩展可能只用了 PHP 的 json_encode(),但如果不显式声明 "php": ">=8.0",别人在 PHP 7.4 环境下 composer install 会成功,运行时才报致命错误。同理:
- Laravel 包必须写清
"illuminate/support": "^10.0|^11.0",不能只写"^10.0",否则 Laravel 11 用户无法安装 - Yii 2 扩展应声明
"yiisoft/yii2": ">=2.0.42",因为早期版本不支持某些事件钩子 - 若扩展本身不依赖框架(如纯工具函数),
"require"里就不该出现框架包 —— 否则会把用户项目也拖进兼容性泥潭
发布前检查 autoload 是否真能加载
最常被忽略的一步:运行 composer dump-autoload -o 后,手动进 vendor 目录,看生成的 autoload_psr4.php 里有没有你注册的命名空间。没有?说明 composer.json 的 psr-4 格式或路径写错了。另外注意:
- Windows 下路径分隔符写成
\没问题,但不要混用/和\ - src 目录必须存在,哪怕为空;如果
"src/"实际是"lib/",autoload 就会静默失败 - 类文件名必须和类名完全一致(大小写敏感),
Handler.php里写class handler在 Linux 下直接Class not found
真正卡住人的从来不是语法,而是命名空间和路径之间那层薄薄的映射关系——它不报错,只沉默地拒绝加载。










