执行 composer create-project 前必须确保在空目录,否则会覆盖当前项目文件;复用旧配置应改用 composer install/update;需同步复制 composer.lock 以保证依赖一致;镜像切换需删除 vendor 和 lock 文件才能生效。

composer create-project 用错路径会覆盖旧项目
直接在已有项目目录里跑 composer create-project,它不会报错,但会把新模板文件一股脑解压进当前目录——vendor、.git、甚至 index.php 都可能被覆盖。这不是“搭建新环境”,是“毁掉旧环境”。
- 务必先
cd到空目录或新建目录,再执行命令,比如:mkdir my-new-app && cd my-new-app && composer create-project laravel/laravel . - 如果想复用旧项目的
composer.json配置(比如私有源、脚本钩子),别用create-project,改用composer install或composer update启动 -
create-project默认会执行post-root-package-install和post-create-project-cmd脚本,某些模板(如 Symfony)会自动删掉 .git 并初始化新仓库——这一步不可逆,确认前先git status看清当前工作区
从旧项目复制 composer.json 后 vendor 目录不生效
直接拷贝 composer.json 过来,运行 composer install 却提示找不到包、或加载不到类?大概率是锁文件和依赖版本没对齐。
- 必须同步复制
composer.lock,否则install会按composer.json重新解析依赖树,结果很可能和旧环境不一致 - 如果旧项目用了 PHP 8.1 特性,而新环境是 PHP 7.4,
composer install可能静默跳过部分包(尤其带platform配置的),得看composer why-not php:7.4检查兼容性 - 私有包若通过
repositories配置,要确认新机器已配置好对应 auth.json 或 SSH key,否则install会卡在 “Cloning into…” 或报Could not fetch …, skipping
用 composer dump-autoload 加速自动加载却没生效
改完类名或目录结构后跑 composer dump-autoload,但 class not found 还在报——不是命令没跑,是 autoloader 没刷新到实际运行时。
- PHP CLI 和 Web Server(如 Apache、PHP-FPM)可能用不同 opcode 缓存,改完后需重启 FPM 或清 opcache:
opcache_reset()或sudo systemctl reload php*-fpm - 如果项目用了 PSR-4 映射,检查
composer.json里autoload.ps4的路径是否写成相对路径(如"App\": "app/"),而新环境的app/目录位置变了 -
dump-autoload -o(优化模式)会生成静态映射表,但会忽略files类型的全局加载项;如果依赖某个helpers.php,得加-a参数或手动 require
本地已有 vendor 但想换镜像源重装
想切到阿里云或腾讯云镜像加速安装,但 composer config -g repo.packagist 改了全局源,install 却还是走原地址——因为 composer.lock 里记录的是原始 dist URL,不是源配置。
- 先删掉
vendor/和composer.lock,再跑composer install,才能真正走新镜像 - 临时切换可用
composer install --repository=https://mirrors.aliyun.com/composer/,但该参数只影响本次请求,不改 lock 文件 - 国内镜像不保证 100% 同步 Packagist,某些刚发布的 beta 版本可能延迟几小时,遇到
Could not find package x at version y,可临时切回官方源验证是否镜像问题
最常被跳过的其实是 composer.lock 的作用边界:它锁的是依赖树结构和具体 commit hash,不是“环境快照”。PHP 版本、扩展启用状态、环境变量这些,composer 一概不管——得靠 .env、Dockerfile 或部署脚本补全。










