composer如何在生产环境避免重复下载?

1次阅读

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

composer如何在生产环境避免重复下载?

composer install 为什么在生产环境还下载包?

因为默认没禁用 dev 依赖,且没走缓存优化路径。生产环境跑 composer install 却触发大量远程下载,八成是没加 --no-dev 或没配 COMPOSER_CACHE_DIR,也可能用了 composer update 代替 install

–no-dev 不加会怎样?

不加就装全部 require-dev 里的包,比如 phpunitmockerylarastan —— 这些在运行时根本用不到,白占磁盘、拖慢部署、还可能引入安全风险。

  • 必须加 --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,要先 COPY composer.jsoncomposer.lock,再 RUN composer install --no-dev --prefer-dist,这样依赖安装层能被复用
  • 别在 RUN 里用 composer create-projectrequire,那会绕过 lock 文件,也破坏缓存链
  • Alpine 镜像要注意 curlopenssl 是否已装 —— 缺这两个,composer install 会静默失败,卡在下载环节不报错

缓存目录权限、lock 文件时间戳、甚至 vendor 目录是否被误加到 .dockerignore,都可能导致“明明配了却还重下”。真要排查,就看 composer install -v 输出里有没有 “Downloading” 或 “Installing xxx from dist” —— 前者是重下,后者才是走缓存或 dist 包。

text=ZqhQzanResources