生产环境执行 composer install 会下载包,主要因未加 –no-dev 参数且未配置 composer_cache_dir 缓存路径;应显式使用 –no-dev –prefer-dist 并确保 composer.lock 存在且未被忽略。

composer install 为什么在生产环境还下载包?
因为默认没禁用 dev 依赖,且没走缓存优化路径。生产环境跑 composer install 却触发大量远程下载,八成是没加 --no-dev 或没配 COMPOSER_CACHE_DIR,也可能用了 composer update 代替 install。
–no-dev 不加会怎样?
不加就装全部 require-dev 里的包,比如 phpunit、mockery、larastan —— 这些在运行时根本用不到,白占磁盘、拖慢部署、还可能引入安全风险。
- 必须加
--no-dev,CI/CD 脚本里漏掉这一项,等于把开发环境搬进线上 - 如果项目用了
config.platform模拟低版本 PHP,记得它不影响--no-dev判定,该删的 dev 包照删 -
composer.lock里虽有 dev 包记录,但install --no-dev会跳过解析它们的依赖树,省下大量网络和 CPU
怎么让 composer 复用已有包而不是重下?
靠两件事:本地缓存 + 锁文件锁定版本。缓存默认存在 ~/.composer/cache,但 CI 环境常是干净容器,得手动挂载或预热。
- 部署前先跑一次
composer install --no-dev --prefer-dist,确保用压缩包而非 git clone(--prefer-dist是默认行为,但显式写上更安心) - 在 CI 中把
COMPOSER_CACHE_DIR指向一个可复用的路径,比如/tmp/composer-cache,并设为构建步骤间共享卷 - 确认
composer.lock已提交,且没被.gitignore拦截 —— 没 lock 文件,install就退化成update,必然重算依赖并拉新包
docker 部署时最常踩的坑
镜像分层导致缓存失效,或者 copy 顺序不对,让 composer 缓存白建。
- Dockerfile 里别一上来就
COPY . /app,要先 COPYcomposer.json和composer.lock,再 RUNcomposer install --no-dev --prefer-dist,这样依赖安装层能被复用 - 别在 RUN 里用
composer create-project或require,那会绕过 lock 文件,也破坏缓存链 - Alpine 镜像要注意
curl和openssl是否已装 —— 缺这两个,composer install会静默失败,卡在下载环节不报错
缓存目录权限、lock 文件时间戳、甚至 vendor 目录是否被误加到 .dockerignore,都可能导致“明明配了却还重下”。真要排查,就看 composer install -v 输出里有没有 “Downloading” 或 “Installing xxx from dist” —— 前者是重下,后者才是走缓存或 dist 包。