composer 必须在 vagrant 的 php 环境中执行,不可在宿主机运行后同步 vendor;需在 /var/www/html/ 下操作、禁用共享文件夹性能瓶颈、确保 autoload 路径匹配虚拟机实际路径。

Composer 在 Vagrant 里不能直接在宿主机上跑完再同步进虚拟机——它必须在 Vagrant 的 PHP 环境里执行,否则 autoload、扩展依赖、路径解析全都会错。
composer 命令必须在 vagrant ssh 会话里运行
很多人习惯在宿主机用 composer install 生成 vendor/ 再挂载进 Vagrant,这会导致:PHP 扩展检测失败(比如 ext-mbstring 在宿主机有、Vagrant 里没)、autoload_real.php 里写死的路径指向宿主机文件系统、某些包的 post-install-cmd 脚本根本执行不了。
- 每次进环境先
vagrant ssh,再 cd 到项目目录 - 确认 PHP 版本和扩展已就位:
php -v和php -m | grep mbstring - 运行
composer install --no-dev(如果只部署)或composer install(开发时) - 不要把
vendor/放进 synced_folder,它应该完全在虚拟机内生成和存在
composer.json 的 autoloader 需匹配 Vagrant 的实际路径
Vagrant 默认挂载点是 /vagrant,但你的项目入口(如 index.php)很可能在 /var/www/html。如果 composer.json 里写了相对路径 autoload 或自定义 psr-4 映射,而你又在 /vagrant 下运行 composer dump-autoload,生成的 autoload_static.php 就会硬编码 /vagrant/app/ 这种路径——等 Nginx 从 /var/www/html 加载时,就找不到类了。
- 统一在 Web 根目录下操作:把项目软链或复制到
/var/www/html/myapp,然后cd /var/www/html/myapp - 检查
composer.json中"autoload"的路径是否基于项目根目录(即当前composer.json所在位置),而不是假设挂载路径 - 运行
composer dump-autoload -o后,打开vendor/composer/autoload_static.php,扫一眼$prefixLengthsPsr4里的路径是不是以/var/www/html/...开头
避免 Vagrant 共享文件夹性能拖慢 composer install
VirtualBox 默认共享文件夹对大量小文件(比如 vendor/ 里几万个)读写极慢,composer install 可能卡住或超时,尤其带 scripts 的包(如 Laravel 的 post-root-package-install)。
- 在
Vagrantfile中禁用默认挂载,改用 rsync 或 NFS:config.vm.synced_folder ".", "/vagrant", type: "rsync" - 更推荐:不挂载整个项目,只用 rsync 单向同步源码,
vendor/完全留在虚拟机本地(加.rsyncignore忽略vendor/、node_modules/) - 如果坚持用 VirtualBox 共享,至少关掉 Composer 的脚本执行:
composer install --no-scripts,后续再手动触发关键脚本
最麻烦的不是装不上,而是装上了却在运行时报 Class not found 或 require(): failed to open stream——那八成是 autoloader 路径写进了宿主机路径,或者 vendor 被跨环境混用了。盯住 vendor/composer/autoload_*.php 里的路径,比反复重装 composer 有用得多。










