Composer 的 archive 命令用于将项目源码(默认排除 vendor、.git、.env 等)打包为 zip/tar 格式,不安装依赖、不读取 composer.lock;可通过 composer.json 的 archive 字段自定义包含/排除规则。

Composer 的 archive 命令用来把当前项目的源码(不含 vendor 目录、.git、.env 等默认排除项)打包成 zip 或 tar 格式,适合发布前快速生成干净的代码分发包。
它不安装依赖,只打包源码
和 install 或 update 不同,archive 完全不碰 vendor,也不读 composer.lock。它只根据项目根目录的 composer.json 里定义的 archive 配置(或默认规则)来决定哪些文件该打包、哪些跳过。
- 默认排除:
vendor/、.git/、.gitignore、.gitattributes、.travis.yml、phpunit.xml、phpunit.xml.dist、.env、composer.lock等 - 默认包含:
composer.json和composer.lock(除非显式排除)——但注意:composer.lock默认会被排除,如果想带上,得在配置里手动加回来
基本用法很简单
在项目根目录下运行:
composer archive --format=zip --file=my-app-1.0
这会生成 my-app-1.0.zip。支持的格式有 zip、tar、tar.gz、tar.bz2。
-
--format指定压缩格式(默认 zip) -
--file指定输出文件名(不含扩展名,命令会自动补) -
--dir可指定输出目录(默认当前目录)
按需自定义打包内容
在 composer.json 的 archive 字段里可以精细控制:
"archive": {
"exclude": ["/tests/", "/docs/", ".editorconfig"],
"include": ["composer.lock"]
}
这样就能保留 composer.lock,同时跳过测试和文档目录。
- 路径以
/开头表示从项目根开始匹配 - 支持通配符,比如
"*.log"、"var/*" - 如果
exclude和include冲突,include优先
适合这些场景
不是所有项目都需要它,但以下情况很实用:
- 准备发布到私有平台(非 Packagist),需要一个不含依赖的轻量源码包
- 交付客户时屏蔽敏感配置或开发专用文件
- CI/CD 流程中自动生成发布包,替代手写 zip 命令
- 想确保每次打包内容一致,避免漏删
node_modules或.DS_Store
基本上就这些。不复杂但容易忽略,默认行为已经覆盖大多数需求,有特殊要求再配 archive 字段就行。










