composer archive 不是导出当前项目的可靠方式,它专为 packagist 包作者设计,仅打包 composer.json 定义的库,跳过 vendor/、.git/ 等目录,且需严格配置 archive 字段、合法 name/version、已打 git tag;日常项目打包应直接用 zip 或 tar 命令。

composer archive 不是导出当前项目为 zip 包的可靠方式,它只打包 composer.json 中定义的「包」(package),且默认不包含 vendor/、.git/、tests/ 等目录——你手动 zip -r 更直接、更可控。
为什么 composer archive 很少被用到
这个命令本质是为 Packagist 上的包作者服务的:把一个可复用的库(比如 monolog/monolog)按规范打包成发行版,供别人 require。它不会理睬你本地项目的结构或部署需求。
- 默认跳过
vendor/、node_modules/、.git/、.DS_Store、phpunit.xml等——但你可能正需要其中某些 - 打包路径基于
composer.json的name和version,不是当前目录名,容易混淆 - 不支持自定义压缩格式(只能 zip),也不能指定输出路径,输出固定在
./dist/ - 执行前必须先
composer install --no-dev,否则会报错Could not find package ... in a version matching ...
composer archive 的正确触发条件
只有当你正在维护一个要发布到 Packagist 的独立组件(例如写了个 acme/utils 库),且已配置好 composer.json 中的 archive 字段时,才考虑它。
- 必须在
composer.json里显式声明"archive": {"exclude": [".git", "/tests/"]},否则用的是 Composer 内置黑名单 - 必须确保
name和version字段合法(如"acme/utils": "1.2.0"),否则打包失败并提示Invalid package name - 运行命令前需确认当前分支已打 tag,因为
archive会尝试读取 Git tag 推断版本 - 实际执行:
composer archive --format=zip --dir=dist,输出为dist/acme-utils-1.2.0.zip
真正想打包整个项目?用 shell 命令更稳
99% 的“导出为 zip”场景(比如交付给客户、上传测试环境、备份部署包),应该绕过 composer archive,直接操作文件系统。
- 排除开发无关内容:
zip -r project-v1.0.zip . -x "vendor/*" ".git/*" "node_modules/*" "*.log" "composer.lock" - 如果需要干净的生产环境包,先
composer install --no-dev --optimize-autoloader,再 zip - 注意路径问题:在项目根目录下执行,避免 zip 包里出现冗余父级目录(如
../project/src/...) - Windows 用户用 PowerShell:
Compress-Archive -Path . -DestinationPath project.zip -Exclude "vendor", ".git", "node_modules"
最常被忽略的一点:zip 包里的文件权限(尤其是 bin/ 下的可执行脚本)在解压后可能丢失,Linux/macOS 上要用 unzip -X 或改用 tar.gz 保留权限。这不是 Composer 的问题,但打包时没意识到,上线就跑不起来。










