Composer打包前应删除vendor/和composer.lock,仅保留composer.json;部署时用composer install --no-dev --optimize-autoloader重建依赖;归档需控制路径扁平化,并生成优化的autoload文件。

Composer打包前必须清理vendor和.lock文件
直接压缩整个项目目录会导致vendor里大量冗余文件混入发布包,而且composer.lock在目标环境可能失效(比如PHP版本不一致、平台扩展缺失)。实际部署时应该用composer install --no-dev --optimize-autoloader --no-interaction重建依赖,所以打包前反而要删掉vendor/和composer.lock——只留composer.json。
常见错误是保留vendor/一起打包,结果包体积暴涨20MB+,且上线后composer install报错“lock file is not up to date”。
- 执行
rm -rf vendor/ composer.lock(Linux/macOS)或rd /s/q vendor & del composer.lock(Windows) - 确认
composer.json中"minimum-stability"设为"stable",避免dev包污染生产环境 - 如果项目含私有包,确保
auth.json不被误打包(加到.gitignore并检查归档命令是否排除)
用tar或zip命令归档时要控制路径层级
打包命令的当前工作目录和-C参数配合不当,会导致解压后多出一层冗余文件夹(比如myapp/myapp/src/),影响后续php bin/console等命令执行。关键不是“怎么压缩”,而是“压缩出来的路径结构是否干净”。
推荐统一用tar(Linux/macOS)或7z(Windows)生成扁平结构:
- Linux/macOS:
tar -czf release.tar.gz --transform 's/^src\///' -C src .(把src/内容打平到根) - 若整个项目可直接运行(含
index.php、composer.json):tar -czf app-release.tar.gz --exclude='*.md' --exclude='.git' --exclude='tests/' . - Windows下PowerShell用
Compress-Archive容易保留绝对路径,改用7z a -tzip app-release.zip -r -x!*.git* -x!tests\* *
自动打包脚本里别硬编码版本号
写死myapp-v1.2.3.tar.gz会导致CI每次都要改脚本。应该从composer.json里读取version字段,或者用Git标签(git describe --tags --abbrev=0 2>/dev/null)。
一个轻量级Bash示例:
#!/bin/bash
VERSION=$(jq -r '.version // "dev"' composer.json)
TARBALL="myapp-${VERSION//[^0-9a-zA-Z.]/-}.tar.gz"
tar -czf "$TARBALL" --exclude='*.md' --exclude='.git' --exclude='tests/' .
echo "Built: $TARBALL"注意点:
-
jq需提前安装,Windows可用curl -s https://api.github.com/repos/.../releases/latest | jq -r '.tag_name'替代 -
${VERSION//[^0-9a-zA-Z.]/-}把非法字符(如+、beta)替换为短横线,避免tar报错 - 别用
date +%s当版本号——线上回滚时无法对应到具体代码提交
发布包里必须包含autoload优化后的dump文件
如果目标服务器没装Composer,或禁止网络访问,composer install会失败。此时需要在打包前生成优化后的类映射:composer dump-autoload --optimize --no-dev。它会把所有PSR-4/PSR-0映射写进vendor/composer/autoload_classmap.php,大幅加速加载。
但要注意:
- 这个文件只在
vendor/存在时才生效,所以打包脚本里必须先composer install --no-dev --optimize-autoloader,再tar整个目录(此时vendor/是精简过的) - 如果项目用了
classmap配置,记得composer dump-autoload --classmap-authoritative,否则运行时仍会扫描文件系统 - 不要同时打
vendor/和composer.json进去——要么全静态(带vendor),要么全动态(只留json),混用会导致autoload行为不一致
实际打包逻辑取决于部署方式:CI推送到制品库(如Artifactory)要带完整vendor/;K8s ConfigMap挂载则倾向只传composer.json + autoload优化文件。路径控制、版本提取、autoload策略这三处稍有偏差,上线就卡在require阶段。


















