生产环境执行 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 —— 这些在运行时根本用不到,白占磁盘、拖慢部署、还可能引入安全风险。
睿拓智能网站系统-睿拓企业网站系统1.2免费版软件大小:6M运行环境:asp+access本版本是永州睿拓信息企业网站管理系统包括了企业网站常用的各种功能,带完整的后台管理系统,本程序无任何功能限制下载即可使用,具体功能如下。1.网站首页2.会员注册3.新闻文章模块4.产品图片展示模块5.人才招聘模块6.在线留言模块7.问卷调查模块8.联系我们模块9.在线QQ客服系统10.网站流量统计系统11.后
- 必须加
--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会静默失败,卡在下载环节不报错
composer install -v 输出里有没有 “Downloading” 或 “Installing xxx from dist” —— 前者是重下,后者才是走缓存或 dist 包。









