archive-dir 是 composer 安装时解压归档包的临时路径,不影响 composer archive 输出位置;后者必须用 -d 参数指定,如 composer archive -f zip -d ./dist。

archive-dir 是什么,它根本不能控制打包输出目录
很多人搜 archive-dir 是想让 composer archive 把 zip/tar 包生成到指定路径,但这个配置项完全不干这事——它只影响 composer install 时下载的包缓存位置(即 vendor 下载前暂存的归档解压路径),和打包命令毫无关系。
真正控制 composer archive 输出位置的,是命令行参数,不是 composer.json 配置。
-
archive-dir的作用:设置 Composer 内部解压临时归档的路径,比如你用composer install --no-cache时,它仍会把 tar 包解到这个目录再复制进vendor - 它的默认值通常是
vendor/composer/archives,修改它对打包行为零影响 - 在
composer.json里写"archive-dir": "dist"不会改变composer archive的输出位置,只会让后续 install 多一层临时解压路径
composer archive 输出路径由 -d 参数决定
composer archive 命令本身不读取 archive-dir,输出路径必须显式用 -d(或 --dir)指定。不加这个参数,默认输出到当前目录。
- 正确做法:
composer archive -f zip -d ./dist→ 生成./dist/myproject-1.0.0.zip - 错误写法:
composer archive -f zip→ 包直接落在当前目录,容易和源码混在一起 - 路径必须已存在,
composer archive不会自动创建父目录;若./dist不存在,会报错:Failed to create directory "./dist" - 支持相对路径和绝对路径,但避免用波浪号(
~/dist),shell 层才展开它,Composer 不识别
想自动化打包?别靠配置,用脚本或 Makefile 控制
没有“一劳永逸”的配置能替代明确的命令参数。CI/CD 或本地发布流程中,应该把 -d 写死在调用逻辑里,而不是指望某处配置生效。
- GitHub Actions 示例:
run: composer archive -f tar -d ${{ github.workspace }}/build - Makefile 示例:
dist:; composer archive -f zip -d ./dist,然后make dist - 如果项目有多个打包目标(zip + tar),建议分别定义命令别名,比如在
composer.json的scripts里写:"dist:zip": "composer archive -f zip -d ./dist",再运行composer run dist:zip - 注意:scripts 中的命令执行环境仍是当前目录,
-d依然必须显式给出,不能省略
archive-dir 真正该改的时候:磁盘空间紧张或权限受限
只有当你遇到 vendor 下解压失败、磁盘满、或 CI 环境禁止写入默认缓存路径时,才需要动 archive-dir。它和打包输出无关,但会影响安装阶段的稳定性。
- 修改方式:在
composer.json的config段加:"archive-dir": "/tmp/composer-archives" - 该路径需保证 Composer 进程有读写权限,且空间足够容纳所有依赖包的原始 tar 归档(通常几 MB 到上百 MB 不等)
- 改完后记得清缓存:
composer clear-cache,否则旧缓存可能还在原路径干扰判断 - 不要把它设成 NFS 或远程挂载路径,解压性能会明显下降,尤其在 CI 容器中
-d;真要调 archive-dir,只因安装卡在解压那步。










