deployer执行composer install卡住的四大原因及解法:源未切至国内镜像;未指定--working-dir导致路径错误;php版本不匹配需显式设bin/php;未加--no-dev致线上装dev依赖。

Deployer 执行 composer install 时卡在“Loading composer repositories”
这是最常见阻塞点,本质是 Deployer 默认在目标服务器上走公网拉包,而国内服务器访问 packagist.org 极慢甚至超时。不是网络问题,是源没切。
- 在
deploy.php的before('deploy:install', 'composer:install')钩子前,加一行: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.aliyun.com/composer/' - 注意:阿里云镜像已停用,必须用
https://mirrors.huaweicloud.com/composer/或https://packagist.phpcomposer.com(后者维护不稳定),别硬套旧教程
Deployer 的 composer:install 任务不读项目根目录下的 composer.json
Deployer 默认把 Composer 当成全局工具用,不会自动 cd 到 release 目录执行,导致它读的是用户家目录或 /tmp 下的 composer.json,报错 Could not find a composer.json file 或装错依赖。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 显式指定工作路径:
set('composer_install_flags', '--working-dir={{release_path}}'); - 确保
release_path已正确定义(默认是{{deploy_path}}/releases/{{release_name}}),且composer.json确实被 rsync 同步过去了 - 如果用了
shared_dirs把vendor提出来复用,必须关掉--prefer-dist,否则会因缓存校验失败中断
PHP 版本不一致导致 composer install 在本地成功、线上失败
Deployer 默认调用系统 php 命令,但很多生产环境用的是 php74、php81 这类带版本号的二进制,或者通过 update-alternatives 切换过,和本地开发环境不一致。
- 强制指定 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 ...')
如何跳过某些包的安装(比如只在 dev 环境需要的 phpunit)
线上不需要 dev-dependencies,但 Deployer 默认不加 --no-dev,会导致装一堆测试工具、拖慢部署、还可能因扩展缺失报错。
- 直接加参数:
set('composer_options', '--no-dev --no-interaction --optimize-autoloader'); - 如果项目里有
config.platform.php指定低版本 PHP,线上又用高版本,会导致require校验失败——此时要删掉 platform 配置,或用--ignore-platform-req=php - 注意:Laravel 的
phpunit在require-dev里,但phpunit/phpunit的某些子依赖可能被require间接拉进来,光靠--no-dev不保险,得看composer show --tree确认
which php、php -v、composer config -g repo.packagist 这三个命令的结果,比 deploy.php 里的任何 set 都重要。










