“Package x is not installable”通常由PHP版本不匹配、pdo扩展未启用、依赖冲突或平台限制导致,需检查php -v、php -m | grep pdo、composer.json的php约束,并慎用--ignore-platform-reqs。

composer install 时提示 “Package x is not installable”
这是 composer 安装迁移工具(比如 doctrine/migrations 或 laravel/framework 自带的迁移)最常卡住的地方——不是命令写错了,而是 PHP 版本、扩展或依赖冲突在后台拦住了。
- 检查当前 PHP 版本是否满足目标包要求:
php -v,再查该包的composer.json里"php": "^8.1"这类约束 - 确认
pdo和对应数据库扩展已启用:php -m | grep pdo(MySQL 要pdo_mysql,PostgreSQL 要pdo_pgsql) - 如果用的是 Laravel,别直接
composer require doctrine/migrations——Laravel 9+ 已内置迁移系统,额外装可能引发版本打架;优先用php artisan migrate - 遇到“package is not installable”,先运行
composer clear-cache,再加--ignore-platform-reqs临时验证是不是平台限制导致(但别长期用)
数据库配置没生效:.env 文件里 DB_* 配置对不上
装完迁移工具,跑 php artisan migrate 或 vendor/bin/doctrine-migrations migrations:migrate 却连错库、报 Connection refused,90% 是环境配置没真正加载进来。
-
.env文件必须位于项目根目录,且不能是.env.example——后者只是模板,不会被读取 - Laravel 中改了
.env后,要清配置缓存:php artisan config:clear(否则还是读缓存里的旧值) - Doctrine Migrations 不读 Laravel 的
.env,得单独配doctrine-migrations.yml或用--configuration指定路径,里面明确写url: 'mysql://user:pass@127.0.0.1:3306/dbname' - 密码含特殊字符(如
@、/)必须 URL 编码,否则解析失败;例如pa@ss/word得写成pa%40ss%2Fword
执行 php artisan migrate 报错 “Base table or view not found: 1146”
这不是数据库连不上,而是 migration 文件本身有问题:表名写错、字段引用了还没建的表、或者 migration 类名和文件名不一致导致没被识别。
- Laravel 要求 migration 文件名格式为
YYYY_MM_DD_HHMMSS_create_posts_table.php,类名必须是CreatePostsTable(驼峰,去掉下划线和后缀),否则artisan扫不到 - 如果在
up()方法里写了DB::table('users')->get()这类查询,而users表还没建(比如这个 migration 排序靠后),就会爆 1146 错误——migration 应只做 DDL(建表/改字段),不做 DML(查数据) - 执行前用
php artisan migrate:status看哪些已跑、哪些待跑;别手动删migrations表记录,容易错乱;回退用php artisan migrate:rollback
doctrine/migrations 的 version 和 migrations 目录不同步
当你用 Doctrine(非 Laravel)管理迁移,vendor/bin/doctrine-migrations migrations:migrate 说 “No migrations to execute”,但目录里明明有新文件——大概率是版本号没注册进数据库。
- Doctrine 用
migrations表记录已执行的 migration 版本号(如Version20230101120000),不是按文件名排序执行的 - 新增 migration 类后,必须先运行
vendor/bin/doctrine-migrations migrations:version --add 'Version20230101120000',再migrate - 类名必须匹配版本号字符串(大小写敏感),且类里
getSql()或up()方法不能空着,否则会被跳过 - 别用
git checkout切分支后直接 migrate ——不同分支 migration 版本号可能重叠,先migrations:sync-metadata-storage再检查状态
事情说清了就结束。迁移工具本身不复杂,难的是每一步背后都藏着环境、命名、顺序、权限四个维度的隐性依赖,漏一个,它就不动。










