composer archive 只打包项目源码而不包含 vendor 目录及 composer.lock、composer.json 等关键文件,本质是为发布源码包(如 GitHub Release)设计,不可用于直接部署;正确做法是先执行 composer install --no-dev 再手动压缩整个目录(保留 vendor、lock、json 和 autoload.php)。

composer archive 不打包整个项目依赖,它只打包当前项目的源码(不含 vendor 目录),且默认不包含 composer.lock 和 composer.json —— 这是很多人误用后发现部署失败的根源。
为什么 composer archive 不能用来“打包依赖”
这个命令本质是为「发布源码包」设计的,比如打一个 GitHub Release 包,不是为部署或离线安装服务。它会:
- 忽略
vendor/目录(无论是否已安装) - 默认排除
composer.lock、composer.json、.git/、.gitignore等元信息文件(除非显式指定) - 不执行
install或dump-autoload,所以压缩包里没有自动加载逻辑
想把依赖一起打包?你真正需要的是「先安装依赖,再压缩整个目录」,而不是依赖 archive 命令。
正确打包含 vendor 的完整项目(含 lock 文件)
确保本地已运行过 composer install --no-dev(生产环境依赖已就位),然后手动 zip:
zip -r myapp-release.zip \ . \ -x "node_modules/*" \ -x ".git/*" \ -x "tests/*" \ -x "phpunit.xml" \ -x "phpcs.xml" \ -x "composer.phar"
关键点:
-
-x排除开发/构建无关目录,避免体积膨胀 - 必须保留
vendor/、composer.lock、composer.json、autoload.php - 不要用
zip .全量压缩,否则可能打包进敏感文件(如.env)
如果坚持要用 composer archive,至少补全必要文件
可以强制包含锁文件和配置,但依然无法带入 vendor:
composer archive \ --format=zip \ --file=myapp-src.zip \ --exclude="node_modules" \ --exclude="tests" \ --include="composer.json,composer.lock"
这种包适合:
- 提交给 Packagist 的 package 源码归档
- 供他人运行
composer install重建依赖 - 但绝不能直接扔到生产服务器当可运行包用
部署场景下更稳妥的替代方案
真要离线部署,推荐组合操作:
- 在 CI 环境中运行
composer install --no-dev --prefer-dist --optimize-autoloader - 用
rsync -avz --delete --exclude='*.log' ./ user@prod:/var/www/myapp/同步 - 或用
tar -czf myapp-deploy.tar.gz --exclude='.git' --exclude='tests' .
记住:composer archive 是「源码快照」,不是「可运行分发包」——混淆这两者,90% 的线上 autoload 错误都源于此。










