ci 中 composer install 卡住是因默认交互模式等待输入,需用 --no-interaction(-n)跳过;仅 --quiet 无效。全局镜像配置须严格满足 repo.packagist 键名、type: "composer"、https 末尾带 /,且项目级 repositories 会覆盖全局配置。

composer install 为什么在 CI 里卡住不动
因为默认开启交互模式,遇到插件提示、平台不匹配警告或 post-install-cmd 里的 Question 调用时,会等输入——而 CI 没有 TTY,进程就挂起,日志停在 Do you want to continue? [y/N] 或干脆无声。
这不是网络慢,也不是镜像失效,是行为没关对。只加 --quiet(或 -q)完全没用,它只压日志,不跳交互逻辑。
-
--no-interaction(或-n)才是关键开关:它让 Composer 绕过所有需人工决策的环节,走默认路径 - 但仅加
-n不够——私有仓库缺auth.json时仍会报错退出;某些旧插件(如hirak/prestissimo)会忽略它,在后台卡住 - 真正稳定的组合必须包含:
--no-interaction --prefer-dist --optimize-autoloader --no-ansi
全局镜像配置为什么看似生效实则无效
执行 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 后,composer install 还是从官方源拉包?大概率是命令写错了三处之一,且 Composer 静默忽略,不报错也不提醒。
必须同时满足:
- 键名是
repo.packagist(单数repo,不是repos或repository) -
composer是type字段值,不是命令名——漏掉它,配置就当不存在 - URL 必须以
https://开头,且末尾带/,例如https://mirrors.aliyun.com/composer/✅,少斜杠会 404
验证是否真生效:运行 composer config -g repo.packagist,输出应为 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。空、null 或报错,说明没配对。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
项目级 repositories 会彻底屏蔽全局镜像
只要项目根目录有 composer.json 并定义了 repositories 字段(哪怕只写 {"packagist.org": false}),全局配置就完全失效——优先级规则是:项目级 > 用户级 > 默认源。
此时想验证镜像是否可用,不能靠改全局配置,得临时指定:
composer update --repository-url=https://mirrors.aliyun.com/composer/-
composer create-project不支持-r参数,CI 脚本里必须先跑config -g再执行 - 若项目确需自定义源(如私有包),建议把镜像地址也写进
repositories,而非依赖全局
--no-scripts 不是静默开关,而是执行拦截器
加 --no-scripts 不是为了让日志更少,而是跳过所有 post-install-cmd、pre-autoload-dump 等自定义脚本——它们可能调用 npm install、chmod 或 readline(),在 CI 或只读环境里直接失败或卡住。
常见误用:
- 以为
--quiet能屏蔽脚本里的echo—— 实际上echo直接打 stdout,--quiet不管 - 以为
--no-interaction能让脚本不卡 —— 错,脚本自己调QuestionHelper::ask(),Composer 不干预 - 加了
--no-scripts后 autoload 没生成 —— 因为有些脚本负责写vendor/autoload.php,跳过之后得手动补composer dump-autoload --optimize
真正容易被忽略的是:脚本是否被跳过,不会在日志里提示你——它就静默地没执行,直到某天发现路由没加载、配置没生成、前端没编译。










