composer archive 不可靠,真正可用的是 composer install --no-dev --prefer-dist 配合手动归档;它不处理 autoload、忽略排除规则、不打包 vendor 外依赖,且 2.x 已移除。

直接说结论:用 composer archive 导出源码包基本不可靠,它不处理 autoload、忽略 .gitignore 外的排除规则、不打包 vendor 以外的依赖源码——真正能用的其实是 composer install --no-dev --prefer-dist 配合手动归档。
为什么 composer archive 基本没人用
这个命令在 Composer 1.x 中存在,但官方文档几乎没提,2.x 已彻底移除。它本质只是把当前目录(含 vendor)简单 zip,不执行依赖解析,也不尊重 composer.json 中的 archive 配置字段(该字段仅用于 Packagist 包发布时的自动归档)。
- 运行
composer archive --format=zip myapp.zip会报错或静默失败,尤其在有 symlink 或未提交 Git 文件时 - 不会过滤
dev-dependencies,tests/、docs/全被打包进去 - 不处理
autoload.files引用的全局 PHP 文件路径是否有效
真正可用的导出方案:先装再打
标准做法是模拟生产环境安装,再用系统工具压缩。关键是让 vendor 里全是 dist 包(即 zip/tar.gz 源码),而非 git clone 出来的源码目录。
- 确保
composer.json中没有"minimum-stability": "dev"或"prefer-stable": false,否则可能拉到 dev 分支 - 执行:
composer install --no-dev --prefer-dist --optimize-autoloader --no-scripts
- 此时
vendor/下每个包都是解压后的纯源码(无 .git、无 tests/),且vendor/autoload.php已优化 - 再用
zip -r myapp-release.zip . -x "node_modules/*" -x ".git/*" -x "tests/*"排除无关项
如果必须包含某些 dev-only 资源(如构建脚本)
不能依赖 --no-dev,得改用 scripts + 自定义排除逻辑:
- 在
composer.json的scripts里加一个archive命令:"scripts": { "archive": [ "@install", "rm -rf vendor/*/{.git,.github,tests,Tests,phpunit.xml*,README.md}", "zip -r release.zip ./ --exclude=\"*/node_modules/*\" --exclude=\"*/.git/*\"" ] } - 然后运行
composer run archive - 注意:Linux/macOS 可用
zip --exclude,Windows 用户得换7z或用 PowerShell 做路径过滤
最易被忽略的一点:Composer 不负责“打包”,它只管依赖安装;所谓“源码包”是否可直接运行,取决于 autoload 是否完整、vendor/bin 工具是否保留、以及你的启动入口是否硬编码了开发专用路径——这些都得在归档前验证,而不是依赖某个命令自动搞定。










