Composer 没有“导出装配体”功能,vendor 目录的嵌套结构由包名硬编码生成,仅作物理存放和自动加载映射,不可配置或扁平化;如需打包分发,应使用 composer install --no-dev 后整体压缩,并确保 composer.lock 一致。

Composer 没有“导出装配体”这个功能,也不处理 CAD 或机械设计中的装配体(assembly)概念。你看到的“装配体”可能是对 vendor 目录下依赖包层级结构的误称,或是混淆了其他工具(如 SolidWorks、Fusion 360)的术语。
为什么 vendor 目录里有嵌套结构,但不是“装配体”?
Composer 的 vendor 目录结构是严格由包名决定的,例如:
-
monolog/monolog→ 对应 Packagist 上的包名monolog/monolog -
symfony/http-foundation→ 对应symfony/http-foundation
这种双层路径(vendor/{vendor}/{package})是硬编码生成的,不可配置、不可扁平化,也**不支持导出为某种“装配体文件”**。它只是解压后的物理存放位置,和自动加载映射强绑定。
想保留依赖的完整层级并打包分发?用 composer install --no-dev + zip
如果你实际需求是:把当前项目连同所有已安装依赖(含完整 vendor 层级)一起打包、迁移或交付给他人,正确做法是:
- 确保
composer.lock已提交,且与composer.json同步 - 运行
composer install --no-dev --prefer-dist(保证环境干净、用压缩包而非 Git 源) - 用系统命令打包:
zip -r myapp-with-vendor.zip . -x "node_modules/*" ".git/*" "*.log" - 接收方无需再运行
composer install,直接可用(前提是 PHP 环境兼容)
注意:vendor 本身不能“导出为装配体格式”,但它的目录树天然保留层级——这是 Composer 的默认行为,无需额外设置。
误用了“装配体”但实际想做依赖隔离?别动 vendor 结构
常见真实场景是:需要多个版本共存(如 Laravel 9 和 10)、或调试本地修改的包。这时:
- 不要试图“导出 vendor 子集”或“拆分装配体”——这会破坏 autoload 和依赖解析
- 改用
path类型仓库指向本地多版本源码目录,让 Composer 自动软链 - 或用独立项目 + git submodule/subtree,物理隔离比路径伪装更可靠
-
config.vendor-dir只能设一个路径,不支持多版本并存;强行改路径会导致autoload.php找不到类
真正容易被忽略的是:vendor/composer/autoload_*.php 文件是动态生成的,它们硬编码了每个包的绝对路径。一旦你手动移动、复制或“导出”某个子目录而不重建 autoload,Class not found 就会立刻出现——这不是结构没保留,而是映射断了。


















