composer install 默认执行 post-install-cmd,但若加了 --no-scripts、--no-dev(导致依赖工具缺失)或 platform 配置不匹配,脚本将被跳过或静默失败;vendor 目录本身不生成运行时文件(如 storage/、config.php),需脚本或手动补全。

composer install 不会执行 post-install-cmd 脚本
很多包(比如 Laravel、Symfony Bundle、PHPStan 扩展)依赖 post-install-cmd 或 post-autoload-dump 钩子生成配置文件、符号链接、缓存或 stub 文件。而 composer install 默认会运行这些脚本——但前提是它们没被显式禁用。
常见踩坑点:
- 你在 CI/CD 或本地执行时加了
--no-scripts,导致php artisan storage:link、phpstan analyse --generate-baseline等关键步骤跳过 - 项目根目录下
composer.json的"scripts"区块里写了钩子,但vendor/bin下对应命令缺失(比如没装phpstan/phpstan),脚本静默失败,无报错提示 - 某些脚本依赖
require-dev中的工具(如laravel/pint),但你用了--no-dev,结果脚本因找不到二进制而中断
某些文件根本不在 vendor 目录里,而是由脚本动态生成
vendor/ 只存放 Composer 下载和解压的包代码,不包含任何运行时生成物。像以下内容都不是 composer install 自动提供的:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
storage/app、storage/logs这类 Laravel 的可写目录(需php artisan storage:link或手动mkdir -p) -
bootstrap/cache/packages.php或config.php(Laravel 的配置缓存,需php artisan config:cache) -
public/mix-manifest.json(由 Laravel Mix 构建产出,和 Composer 无关) -
.env.example→.env的复制(纯人工操作或部署脚本完成)
platform 配置导致部分包被跳过安装
如果 composer.json 里有 "config": {"platform": {"ext-fileinfo": "0"}}} 这类强制声明,而你本地 PHP 实际没启用 fileinfo,Composer 会跳过所有声明了 "ext-fileinfo" 为必需的包(如 league/flysystem),连带其提供的 bin 命令、配置模板、资源文件一并消失。
验证方式:
- 运行
composer check-platform-reqs,看哪些扩展标红 - 运行
composer show league/flysystem,确认它是否出现在列表中;若没有,说明因 platform 不满足被整体过滤 - 检查
composer.lock里该包是否存在 —— 如果 lock 里有,但vendor/里没有,基本就是 platform 拦截了
vendor 目录权限或挂载方式导致文件不可见
在 Docker 容器、WSL2 或 NFS 挂载卷中,vendor/ 下某些文件可能因权限掩码(umask)、用户 UID/GID 不匹配或文件系统不支持 symlink 而“丢失”:
- Linux 宿主机上
chmod -R 755 vendor后,在 WSL2 中执行ls vendor/bin为空 —— 实际是 symlink 解析失败 - Docker 中用
volume挂载了空目录覆盖vendor/,导致容器内看到的是空文件夹 - 某些 IDE(如 PhpStorm)在远程解释器模式下,不会同步显示
vendor/中的自动生成文件(如vendor/bin/phpunit),但命令行可执行
composer install 没装全,而是后续构建、初始化、权限或环境链路断了。别急着重装 vendor,先确认那几个文件到底该由谁生成、在哪个环节生效、是否已被跳过。

















