可落地的自定义扩展包开发需满足:本地改代码实时生效、类自动加载;关键包括设"type"和"autoload"(psr-4)、配path repository三要素对齐、启用"symlink"、执行"composer dump-autoload"及正确注册service provider。

能直接在本地改代码、实时生效,且装进 Yii/Laravel 项目后类能自动加载——这才是可落地的自定义扩展包开发流程。其他绕路方案(比如每次改完都 push + tag + packagist 同步)只适合发布,不适合开发。
composer init 后必须手动补全的关键字段
执行 composer init 只是起点,生成的 composer.json 缺少扩展包运行必需的元信息:
-
"type"字段要显式设为"library"(通用 PHP 包)或"laravel-package"(Laravel 专用),否则 Laravel 自动发现机制不会触发 -
"autoload"必须声明 PSR-4 映射,例如{"psr-4": {"MyVendor\MyPackage\": "src/"}};路径错一位、命名空间斜杠方向反了、末尾多加反斜杠,都会导致Class not found -
"require"至少得有"php": "^8.1"(Yii 3 / Laravel 10+ 已不支持 PHP 8.0),漏掉会导致安装时被稳定性策略过滤 - 别信
composer init的交互提示——它默认把minimum-stability设成"stable",但本地开发用的是dev-main,必须手动改成"dev"或删掉该字段让 Composer 退回到默认行为
本地开发必须配 path repository,且三要素严格对齐
不配 repositories,composer require myvendor/mypackage 永远报 Could not find package,哪怕包就在隔壁文件夹。根本原因不是网络问题,而是 Composer 根本没“看见”你。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
repositories必须写在主项目根目录的composer.json里,且是合法 JSON 数组:[{"type": "path", "url": "../mypackage"}];写在子目录、写进config或extra字段,全部无效 - 本地包目录下必须有
composer.json,其中"name"必须和require中完全一致(大小写敏感),例如"myvendor/mypackage",不能是"mypackage"或"MyVendor/MyPackage" - 本地包的
"version"推荐设为"dev-main",而主项目require也必须写"myvendor/mypackage": "dev-main";用"*"或"^1.0"会失败,因为 path 源不解析版本号,只认分支名 - 本地包目录必须已执行过
git init && git commit,否则 Composer 直接跳过该路径,不报错也不提示
改代码后立即生效的关键操作
默认 composer update myvendor/mypackage 是复制模式,改源码不会反映到 vendor 里。要实时生效,必须启用符号链接:
- 在
repositories条目中加"options": {"symlink": true};Windows 下必须显式写,且命令行需以管理员权限运行(或开启开发者模式) - 执行
composer update myvendor/mypackage(不是install),否则已有链接不会刷新目标 - 验证是否成功:
ls -la vendor/myvendor/mypackage(Linux/macOS)应看到->指向源目录;Windows 下dir vendormyvendormypackage应显示“快捷方式”类型 - 改完本地包代码后,无需任何命令,主项目立刻读取最新文件——但前提是已运行过
composer dump-autoload,否则新增类仍不可用
autoload 和 service provider 常见失效点
包装进去了,Class not found 还是满屏飞——90% 是 autoload 或 provider 注册环节出问题:
- 本地包自己的
composer.json里autoload配置必须正确,且改完后主项目要执行composer dump-autoload(开发阶段不用-o) - 如果是 Laravel 包,
extra.laravel.providers必须声明完整类名,例如["MyVendor\MyPackage\MyPackageServiceProvider"];类文件必须放在src/下,文件名与类名严格一致(MyPackageServiceProvider.php) - Yii 2 扩展需要手动在
config/web.php的modules或components里注册,Composer 不做这件事 - 别在
require 'vendor/autoload.php'之前就实例化类——此时 autoloader 还没加载,必然失败
最易被忽略的是:本地跑通 ≠ CI 跑通。CI 环境下必须确保 cache-dir 挂载到本地高速盘,且 composer install 加 --no-dev --prefer-dist,否则 symlink 会被强制转为 copy,改代码就失效了。










