thinkphp扩展包的迁移文件须置于database/migrations/目录,通过服务提供者boot()中注册路径并配合topthink/think-migration扫描执行,不可放src/内;命名需严格遵循yyyymmddhhiiss_describe格式,否则命令静默跳过。

扩展包里怎么放迁移文件
迁移文件不能直接扔进 src/,得单独规划目录结构。主流框架(Laravel、ThinkPHP、Yii)都要求迁移脚本存放在固定路径,比如 database/migrations/ 或 phinx/migrations/。你得在扩展包根目录下显式创建这个路径,并确保它被纳入自动加载范围之外——Composer 不负责加载迁移类,而是由框架或迁移工具(如 Phinx、Artisan)扫描该目录执行。
常见错误现象:php artisan migrate 找不到你的迁移类,或者 php think migrate:run 报“no migrations to run”。根本原因不是路径写错,而是:① 迁移文件没放在框架预期位置;② 扩展包未向主项目暴露该路径(比如没注册发布逻辑)。
- ThinkPHP 扩展需配合
topthink/think-migration,迁移文件放database/migrations/,并通过服务提供者调用publishes()发布到主项目 - Laravel 扩展应把迁移文件放在
database/migrations/,并在服务提供者中用$this->loadMigrationsFrom(__DIR__.'/../database/migrations'); - 纯 Phinx 包(不绑定框架)可把迁移文件放
migrations/,但必须在phinx.yml中配置paths.migrations指向该目录
如何让主项目识别并运行你的迁移
光有文件不够,得让主项目的迁移命令“看见”它。不同框架机制不同,但核心都是路径注册 + 命令桥接。
以 Laravel 为例:你在扩展包的 ServiceProvider 中必须重写 register() 或 boot() 方法,显式告知 Artisan:“这些迁移归我管”。否则 artisan migrate 只扫主项目 database/migrations,完全无视 vendor 下的包。
- Laravel:在服务提供者中调用
$this->loadMigrationsFrom(...),且该方法必须在boot()中调用(register()太早,迁移系统未初始化) - ThinkPHP:需在服务提供者的
boot()中调用app()->db->getMigrationPath()或手动将迁移路径加入全局迁移扫描队列(依赖topthink/think-migration的钩子) - 自定义 CLI 脚本:可在扩展包里提供
bin/migrate-up,内容为php vendor/your/name/src/Migrator.php up,然后在 composer.json 的scripts里声明,供主项目通过composer run migrate-up触发
本地开发时迁移文件不生效的典型原因
改了扩展包里的迁移文件,但在主项目跑 php artisan migrate 却没反应——这不是缓存问题,是符号链接或路径映射没生效。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
关键点在于:Composer 默认用 copy 模式安装包,改源码不会同步到 vendor/ 目录。你必须启用 path 仓库 + symlink,否则永远在改“副本”,而不是“源”。
- 主项目
composer.json的repositories必须包含 type: "path" 条目,且url是相对路径(如"./packages/my-pkg"),不能是绝对路径 - 本地包自己的
composer.json中name字段必须和主项目require中声明的完全一致(包括大小写) - 执行
composer update your-vendor/your-package,不是install——只有update会重建 symlink - Windows 用户必须在
repositories条目中加"options": {"symlink": true},并以管理员身份运行命令行
多数据库支持与连接隔离怎么做
你的扩展包不能硬编码用 default 连接,否则会和主项目冲突。迁移命令必须能接收 --connection 参数并透传给底层执行器。
Phinx 支持 --environment 切换配置,Laravel 的 migrate 命令原生支持 --database。但如果你封装了自定义迁移逻辑,就得手动解析参数并设置连接实例。
- 不要在迁移类里写
DB::connection('default'),改用$this->getAdapter()->getConnection()(Phinx)或$this->getConnection()(Laravel 的 Migration 类) - ThinkPHP 的
think-migration允许在命令行传--connection=db2,前提是你的迁移文件里没写死连接名 - 如果扩展包要支持多个连接,迁移文件里应避免使用
Schema::create()这类全局门面,改用连接实例上的schema()方法
真正容易被忽略的是迁移文件的命名规范:Laravel 要求时间戳前缀(如 2023_01_01_000000_create_users_table.php),Phinx 要求严格的时间+描述格式(如 20230101000000_create_users_table.php)。少一个数字或格式错位,整个迁移就会静默跳过。










