composer install 和 composer dump-autoload 不是打包命令,真正打包需用 composer archive 或手动构建发布结构;后者须确保 composer.json 合法、autoload 清晰、路径解耦、环境假设显式声明。

composer install 和 composer dump-autoload 不是打包命令
很多人以为 composer install 或 composer dump-autoload 能“打包”项目,其实它们只是安装依赖或重生成自动加载文件,不产生可分发的安装包。真正打包得靠 composer archive 或手动构建发布结构。
用 composer archive 生成 zip/tar 包(最简方式)
这个命令能按 composer.json 的 archive 配置打包,跳过 dev 依赖、测试文件、.git 目录等,适合快速产出轻量发布包。
- 先在
composer.json里加配置(否则默认只打包源码,不含 vendor):
"archive": {
"exclude": ["/tests/", "/Tests/", ".git", ".gitignore", "phpunit.xml", "README.md"]
}
- 执行命令生成压缩包:
composer archive --format=zip --file=myapp-v1.0
- 注意:它不会自动安装 vendor,生成的是「源码包」,不是「可运行安装包」;如果要带依赖,得先
composer install --no-dev --optimize-autoloader,再把整个目录打 zip - Windows 下路径分隔符可能引发排除失效,建议统一用正斜杠
/
生成真正可安装的“包”要自己组织结构
Composer 官方不提供“一键生成安装包”的能力——它本身是依赖管理器,不是打包工具。所谓“安装包”,实际是你把项目整理成别人能 composer require your/vendor:dev-main 或 composer create-project 拉下来的形态。
- 必须有合法的
composer.json,含name(格式为vendor/name)、type(如project或library)、autoload - 想支持
create-project,得确保根目录下有可执行入口(如bin/app)且权限正确(Linux/macOS 需chmod +x) - 如果项目含二进制命令,别忘了在
composer.json中声明bin字段,否则composer install不会软链到vendor/bin/ - 私有包要发布到 Packagist 或私有仓库(如 Satis、Private Packagist),光有 zip 文件不能被
require
常见打包失败原因:autoload 和路径硬编码
打包后本地跑得通,一放到新环境就报 Class not found 或 Cannot open file,90% 是因为没处理好自动加载和路径假设。
-
composer dump-autoload -o必须在打包前执行,否则 PSR-4 映射没优化,生产环境加载慢甚至失败 - 代码里写死
__DIR__.'/../vendor'或dirname(__FILE__)在 zip 解压后容易错位;改用dirname((new \ReflectionClass(\Your\Class::class))->getFileName())或 Composer 提供的vendor/autoload.php绝对路径更稳 - 如果用了
classmap,记得composer dump-autoload -a重新扫描,否则新增类不会进映射表 - .env 文件不会被
composer archive自动排除,但又不该打进包——要么加进exclude,要么文档里明确要求用户自行配置
打包不是点一下按钮的事,关键在 autoload 是否干净、路径是否解耦、环境假设是否显式声明。漏掉其中任何一环,传出去的 zip 就是个半成品。










