Composer 默认将包安装到 vendor 目录,唯一可靠方式是提前在 composer.json 中设置 "vendor-dir" 并删除原有 vendor 后运行 composer install;单包路径需依赖 composer/installers 插件及 extra.installer-paths 配置。

composer install 默认装到 vendor 目录,改不了
Composer 没有全局配置项能直接把所有包装到 vendor 之外的路径。所谓“自定义安装路径”,实际只有两种可控方式:一是改整个项目的 vendor-dir,二是对单个包用 installer-paths(需插件支持)。硬改 composer.json 里的 vendor-dir 是最常用也最稳妥的做法。
常见错误现象:composer install 后还是出现在 vendor/,但你在 composer.json 里写了 "vendor-dir": "lib" —— 原因通常是没删掉已有的 vendor 目录再重装;或者用了 composer update 而不是 composer install(后者才读取 vendor-dir 配置)。
- 必须在运行
composer install前设置好vendor-dir,且确保vendor目录不存在 -
composer update不会移动已有包,只更新内容;要生效必须清空后重装 - 该配置只影响当前项目,不影响全局或其他项目
- 路径值支持相对路径(如
"lib")和绝对路径(如"/var/www/myapp/libs"),但绝对路径在团队协作中容易出问题
想把某个包单独装到指定目录?得靠 composer/installers
默认 Composer 不支持按包指定路径,installer-paths 是 composer/installers 插件提供的能力。没有它,extra.installer-paths 配置完全无效。
使用场景:比如你用 drupal/core,想把它放进 web/core;或者把一个私有 UI 组件库放到 resources/js/vendor —— 这类需求必须启用插件并配规则。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先执行
composer require composer/installers - 在
composer.json的extra下加installer-paths映射,例如:{"installer-paths": {"web/core": ["drupal/core"], "resources/js/vendor/{$name}": ["myorg/ui-kit"]}} - 键是目标路径(支持
{$name}占位符),值是包名数组;路径必须相对于项目根目录 - 该机制只对声明了
type的包生效(如drupal-module、wordpress-plugin),普通library类型默认不触发,除非你同时在包自己的composer.json里设了兼容的type
vendor-dir 改了,autoload 就自动跟着变吗?
会。Composer 自动生成的 vendor/autoload.php 路径由 vendor-dir 决定,但自动加载逻辑本身(如 PSR-4 映射)不受影响。只要你的 autoload 配置写的是源码路径(如 "src/"),跟 vendor 放哪无关。
容易踩的坑:有人把 vendor-dir 改成 ../shared/vendor,结果部署时发现 autoload.php 找不到——因为生成的 autoload 文件里硬编码了相对路径,跨目录后 __DIR__ 计算失效。
- 避免用上级目录(
..)作为vendor-dir值,尤其在容器或共享主机环境 - 如果非要用,确保运行
composer dump-autoload后检查生成的vendor/autoload.php里$vendorDir变量是否正确 - Autoload 性能不受
vendor-dir影响,但文件系统层级过深可能略微拖慢首次加载(可忽略)
CI/CD 或 Docker 中改 vendor 路径要注意什么
在 CI 流水线或 Docker 构建中,vendor-dir 改动会导致缓存失效、路径不一致甚至权限错误。最典型的是:本地开发用 vendor,CI 里却配成 lib,结果部署脚本还硬写死了 vendor/autoload.php。
性能影响不大,但兼容性风险高。Docker 中若把 vendor 挂载为 volume,又在 composer.json 里指定了不同路径,容器内根本找不到 autoload 文件。
- CI 配置和本地
composer.json必须一致;不要靠环境变量动态改vendor-dir - Dockerfile 中执行
composer install前,确保 WORKDIR 正确,且vendor-dir路径有写入权限 - 部署脚本里别写死
vendor/autoload.php,改用require __DIR__ . '/vendor/autoload.php';(相对路径)或通过 Composer API 动态加载
composer update 会不会悄悄绕过你的配置。

















