config.vendor-dir是唯一生效的vendor目录配置,必须写在composer.json最外层config字段下、用相对路径,且需删除旧vendor后执行install;update不迁移包,installer-paths仅对特定type包生效。

config.vendor-dir 必须写在 composer.json 的 config 字段下
改 vendor 目录位置,唯一生效的配置就是 config.vendor-dir,但它必须出现在 composer.json 文件最外层的 config 对象里,不能塞进 extra、scripts 或缩进错位。常见错误是把它写成:
{
"extra": {
"config": { "vendor-dir": "libs" }
}
}
这完全无效。正确结构是:
{
"config": {
"vendor-dir": "third-party"
},
"require": { ... }
}
- 值必须是相对路径,比如
"third-party"或"deps",不能以/开头,也不能含$HOME、~或通配符 - 该配置只在
vendor目录不存在时才起作用;如果已有vendor/,改完后必须手动删掉它,再运行composer install -
composer update不会迁移已有包,也不会重建 autoload 入口文件——它只更新依赖内容,不重置路径逻辑
bin-dir 要和 vendor-dir 同步配置,否则命令调用失败
很多包(如 phpunit、laravel-zero)通过 "bin" 字段声明可执行文件,Composer 默认把它们软链到 vendor/bin/。你只改了 vendor-dir,没配 bin-dir,链接就指向不存在的位置。
必须在同一个 config 块里显式声明:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
{
"config": {
"vendor-dir": "third-party",
"bin-dir": "third-party/bin"
}
}
- CI 脚本或部署命令中硬编码的
vendor/bin/phpunit得同步改成third-party/bin/phpunit - 如果用了
composer create-project,首次安装可能忽略bin-dir配置,装完要手动检查third-party/bin/下是否存在对应文件 - IDE(如 PHPStorm)默认只索引
vendor/bin,需在 Settings → PHP → CLI Interpreter → Path mappings 中补上新 bin 路径映射
installer-paths 不是通用路径重定向,别指望它改普通库位置
extra.installer-paths 看起来像“按包名指定安装路径”,但它只对明确声明了 type(如 wordpress-plugin、drupal-module)且项目已引入对应 installer(如 composer/installers)的包生效。
- 普通库(
type: library)哪怕写进installer-paths规则里,也照旧进vendor/或你配的vendor-dir - 规则里的包名必须完全匹配(大小写敏感),不支持通配符,比如
"myorg/*"不会命中myorg/utils - 路径值是相对于项目根目录的,例如
"web/wp-content/plugins/{$name}",但前提是目标包composer.json里写了"type": "wordpress-plugin"
改完 vendor-dir 后,所有 require 和脚本都得手动更新
vendor/autoload.php 是生成时写死路径的入口文件。你改了 vendor-dir,但没改代码里的 require,PHP 就还在找原来的路径。
- 所有入口文件(
index.php、cli.php、测试启动脚本)中的require 'vendor/autoload.php'必须改成require 'third-party/autoload.php' -
autoload.files里写的路径是相对于composer.json的,不受vendor-dir影响,但如果你把 helper 文件挪到了新 vendor 下(比如third-party/mylib/helpers.php),就得重写路径 - CI 脚本、Dockerfile、部署钩子中所有涉及
vendor/的路径(包括cp vendor/bin/*、php vendor/bin/phpunit)都要逐个检查替换
最容易被忽略的是:改完后 composer dump-autoload 不够——它只刷新类映射,不重建 autoload.php 入口文件或符号链接。必须删掉整个 third-party/(或你设的新目录),再跑一次 composer install。

















