Laravel Vapor 中优化 Composer 部署需三步:启用 --prefer-dist 和 --no-scripts 加速安装;配置 cache: vendor: true 复用依赖层;精简 vendor 文件或分离为 Lambda Layer。

在 Laravel Vapor 环境中,Composer 的部署流程默认会执行完整安装(composer install --no-dev),但若未合理配置,容易导致冷启动慢、部署超时、Lambda 层体积过大或重复下载依赖等问题。优化核心在于减少构建时间、控制依赖体积、避免运行时重复操作。
启用 Composer 的 --prefer-dist 和 --no-scripts
Vapor 构建阶段默认使用 composer install,但未强制指定安装策略。添加 --prefer-dist 可跳过源码克隆,直接下载压缩包,显著加快安装速度;加上 --no-scripts 能跳过 post-install-cmd 等钩子(如 Laravel 的 autoload 重生成),因为 Vapor 已预编译自动加载映射。
- 在
vapor.yml的build阶段自定义命令:
build: | composer install --no-dev --prefer-dist --no-scripts --quiet
注意:确保项目已通过 composer dump-autoload --optimize-autoload 提前生成高效自动加载映射(推荐在 CI 中完成,或提交 vendor/autoload.php 的优化版本)。
利用 Vapor 的缓存机制跳过重复安装
Vapor 默认不缓存 vendor/ 目录,每次部署都重新安装依赖。可通过启用 cache 配置复用上一次成功构建的依赖层:
- 在
vapor.yml根级添加:
cache: vendor: true
该配置会让 Vapor 在 S3 缓存 vendor/ 内容,并基于 composer.lock 的 SHA256 值判断是否命中缓存。只要 lock 文件未变,就直接复用,省去整个 composer install 步骤。
⚠️ 注意:启用后需确保 composer.lock 始终提交到 Git,且团队统一使用相同 PHP 版本和平台配置(如 ext-zip 是否启用),否则可能因平台差异导致缓存误用。
精简 vendor 层,排除无用文件
Lambda 对部署包大小敏感(单个函数 ≤ 250MB,含 layers)。Composer 默认安装的测试、文档、开发工具等文件会增大体积,影响上传与冷启动。
- 使用
composer install --no-dev是基础,但还不够;建议配合hirak/prestissimo(已内置在较新 Composer 版本中)加速并行下载 - 在
composer.json中配置extra清理规则:
"extra": {
"laravel": {
"dont-discover": []
},
"exclude-from-classmap": [
"/Tests/",
"/tests/",
"/Test/",
"/test/",
"/docs/",
"/Docs/",
"/benchmarks/",
"/vendor/bin/"
]
}也可在 vapor.yml 的 build 后追加清理命令:
build: | composer install --no-dev --prefer-dist --no-scripts --quiet find vendor/ -name "*.md" -delete find vendor/ -name "*.txt" -delete find vendor/ -name "phpunit*" -delete
分离应用代码与依赖层(高级)
对大型项目,可将 vendor/ 打包为独立 Lambda Layer,实现依赖复用与快速迭代:
- 创建专用 layer 构建脚本(如
build-layer.sh),仅运行composer install --no-dev --no-scripts并打包成 ZIP - 在
vapor.yml中引用该 layer:
environments:
production:
layers:
- arn:aws:lambda:us-east-1:123456789012:layer:my-vendor-layer:3此时主部署包仅含应用代码,体积锐减,更新业务逻辑无需重传 MB 级依赖。但需自行管理 layer 版本与更新策略(例如按 major PHP 或 major Laravel 版本切分 layer)。
基本上就这些。关键不是堆砌技巧,而是根据项目规模选对组合:中小项目开 cache + --prefer-dist 就够用;高频迭代项目加 layer 分离;严格受限环境再叠加文件清理。Vapor 的构建本质是容器化过程,把 Composer 当作构建工具而非运行时依赖管理器,思路就清晰了。










