composer archive 默认只打包项目源码,不包含 vendor/、.git/、node_modules/ 等目录,文件名形如 myapp-2.1.0.zip(version 取自 composer.json),输出至 dist/ 目录;它不执行安装或构建逻辑,仅为轻量级源码归档。

composer archive 只导出当前项目源码,不包含 vendor、不安装依赖、不执行构建逻辑——它不是“打包可运行包”的工具,而是轻量级源码归档命令。
composer archive 默认打包什么内容
它只读取当前目录下的 composer.json,提取 name 和 version 字段生成文件名(如 myapp-2.1.0.zip),然后递归复制项目根目录下所有文件(除硬编码排除项外)到归档中。
- 默认排除
.git/、vendor/、node_modules/、.DS_Store等,但tests/、docs/、.env.example这类都会被打进去 - 不读取
.gitignore,只认composer.json里的archive.exclude和.gitattributes中的export-ignore - 如果
composer.json没写version,会 fallback 到dev-main或 git 当前 commit hash,导致文件名不可控
怎么用 archive.exclude 精确排除测试和文档
archive.exclude 必须定义在 composer.json 顶层(和 require 同级),且只支持 * 和 ?,不支持 ** 或递归匹配。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
"tests/*"→ 排除tests/下一级所有文件,但tests/unit/HelperTest.php仍会被包含 -
"tests/"(带尾部斜杠)→ Composer 会当作目录通配,实际生效,排除整个tests/目录 -
"*.md"→ 排除所有 Markdown 文件,包括README.md和CHANGELOG.md -
".env"→ 排除.env,但.env.example不受影响;若想一并排除,得加".env.*"
为什么 --dir=./dist 会失败,而 --dir=dist 可以
--dir 参数要求路径必须已存在,Composer 不会自动创建父级目录。相对路径解析也容易出错。
-
composer archive --dir=./dist→ 若当前目录下无dist/,报错:Failed to create directory "./dist" -
composer archive --dir=dist→ 行为一致,但更简洁;推荐先手动mkdir -p dist -
--dir=../releases→ 有效,但需确保上层目录可写;--dir=~/releases❌ 无效,波浪号不被 Composer 展开 - 注意:
archive-dir是 composer.json 里一个完全无关的配置项,它控制的是install时的临时解压路径,对archive命令零影响
如何打包成 .tar.gz 而不只是 .tar
composer archive --format=tar 生成的是未压缩的 .tar 文件。gzip 压缩必须手动追加,不能靠参数一步到位。
- 正确流程:
composer archive --format=tar --file=myapp-2.1.0 --dir=dist && gzip dist/myapp-2.1.0.tar - 结果得到
dist/myapp-2.1.0.tar.gz,解压需用tar -xzf,不是unzip - Windows 用户建议坚持用
--format=zip,避免 tar 工具链兼容性问题 - 别试图在
composer.json里设"format": "tar.gz"—— 它只接受zip或tar,其余值静默忽略
真正容易被忽略的是:这个命令从不验证 autoload 配置是否有效,也不检查 classmap 是否完整。如果你打算把打包结果直接扔进生产环境运行,得自己确认 composer dump-autoload --classmap-authoritative 已执行过,否则可能在部署后遇到 Class not found。










