应将 Composer 源切换为国内镜像(如华为云),并在 deploy.php 中设置 --working-dir={{release_path}} 指定工作路径,同时指定正确 PHP 路径(如 /usr/bin/php8.1),vendor/ 不应放入 shared_dirs。

Deployer 里执行 composer install 卡在 “Loading composer repositories” 怎么办
这不是网络连不上,是源没切到国内镜像。Deployer 默认走 packagist.org,而国内服务器访问它极慢甚至超时。
两种解法,推荐先试第一种:
- 在
deploy.php中加配置:set('composer_options', '--no-interaction --optimize-autoloader --prefer-dist --repository-url=https://packagist.phpcomposer.com'); - 更彻底的做法:部署前手动在目标机换全局源,运行
ssh user@host 'composer config -g repo.packagist composer https://mirrors.huaweicloud.com/composer/'(注意阿里云镜像已停用,别再用)
如果用了私有包或自建 Packagist,--repository-url 必须指向你自己的源,且确保目标机可访问。
deploy:composer:install 任务报 “Could not find a composer.json file”
Deployer 默认不自动 cd 到新 release 目录,所以它读的是用户家目录或 /tmp 下的 composer.json,而不是你刚 rsync 过去的那个。
必须显式指定工作路径:
- 加这行配置:
set('composer_install_flags', '--working-dir={{release_path}}'); - 确认
{{release_path}}已正确定义(默认是{{deploy_path}}/releases/{{release_name}}) - 检查
rsync_exclude是否误删了composer.json,比如写了['/']这种错误排除规则
别依赖 Deployer 自动识别项目结构——它不会读 deploy.php 同级的 composer.json,一切路径都得你写死或用变量拼出来。
为什么线上 composer install 失败,但本地完全正常
90% 是 PHP 版本或二进制路径不一致。Deployer 默认调 php 命令,但生产环境常用 php8.1、php74 或通过 update-alternatives 切换过。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
验证方式很简单:在 deploy.php 开头加一行 run('php -v');,看输出是否和你预期一致。
修复方法:
- 强制指定 PHP 路径:
set('bin/php', '/usr/bin/php8.1');(路径必须先 ssh 登上去确认) - 检查
composer --version输出里的 “PHP version”,它必须和php -v完全一致,否则说明 Composer 是用另一个 PHP 编译的 - 若用 Docker 部署,别在 host 上跑 Composer,改用:
run('cd {{release_path}} && docker run --rm -v $(pwd):/app -w /app php:8.1-cli composer install');
该不该把 vendor/ 放进 shared_dirs
不该。共享 vendor/ 是反模式,会导致多版本 release 共用同一份 autoload map 和类文件,极易引发类加载冲突、缓存失效、无法回滚。
正确做法是每次部署都在新 release_path 独立执行 composer install,并确保 vendor/ 不参与同步:
- 在
deploy.php中设置:set('rsync_exclude', ['vendor/', 'node_modules/', '.git/']); - 确认项目根目录的
.gitignore已包含vendor/,否则deploy:update_code可能因未跟踪文件报错 - 禁用
--prefer-dist(如果用了shared_dirs提 vendor),否则 Composer 会因缓存校验失败中断
真正该共享的是 .env、storage/、public/uploads 这类运行时数据,不是依赖本身。










