ci中composer install慢或失败主因是缓存未配、参数缺失或环境前提被忽略,需确保提交composer.lock、安装必要php扩展、设置composer_memory_limit=-1、挂载~/.composer/cache,并使用--no-interaction--no-progress--prefer-dist--optimize-autoloader--ignore-platform-reqs组合参数。

CI 里 composer install 慢、卡住、不执行脚本,基本不是命令写错,而是缓存没配对、参数没打全、或环境前提被忽略。
为什么 CI 中 composer install 总是慢或失败
常见现象:构建耗时超 2 分钟、卡在 Installing dependencies from lock file、Root package cannot be found、vendor 目录空着就结束。根本原因不是网络差,而是每次都在重做三件事:下载 ZIP 包、解压进 vendor、生成 autoload 映射。
- 没提交
composer.lock:CI 拉下来的代码里没有它,composer install直接报错退出,不会自动生成 - PHP 扩展缺失(如
ext-zip、ext-openssl):尤其 Alpine 镜像需手动apk add php81-zip,否则静默跳过或崩溃 - 内存不足:Composer 解析依赖图峰值高,CI 默认限制常触发
Killed,得在脚本开头加export COMPOSER_MEMORY_LIMIT=-1 - 没缓存
~/.composer/cache:哪怕 vendor 缓存了,每次仍要重新下载 ZIP 包;只缓存 vendor 反而危险——不同 PHP 版本生成的 autoloader 不兼容
CI 脚本中必须加的参数组合
别拼凑,直接用这串:composer install --no-interaction --no-progress --prefer-dist --optimize-autoloader --ignore-platform-reqs。少一个都可能出问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-interaction:禁掉所有交互,包括 GitHub OAuth 提示、post-install-cmd 里的read或confirm -
--prefer-dist:强制走 ZIP 包安装,比 git clone 快 3–5 倍,且能命中~/.composer/cache中的包缓存 -
--optimize-autoloader:生成扁平化autoload_classmap.php,跳过运行时目录扫描,测试启动快 20%+ -
--ignore-platform-reqs:CI 镜像常为最小化配置,跳过 PHP 版本/扩展检查;若需校验,改用--platform=php:8.2
post-install-cmd 在 CI 中为什么不执行
不是脚本坏了,是触发条件根本没满足。post-install-cmd 只在以下任一成立时才跑:vendor/ 不存在或为空、composer.lock 缺失或与 composer.json 不匹配、且没加 --no-scripts。CI 流水线里常因缓存保留了旧 vendor/ 或 lock 文件完整,导致它静默跳过。
- 别把它当“每轮部署都跑”的钩子,只适合“首次构建”初始化场景
- 真要每轮都执行的动作(如清缓存、设权限),定义成独立脚本名:
"scripts": { "deploy:setup": ["@php artisan cache:clear"] } - CI 脚本里显式调用:
composer install --no-dev --optimize-autoloader && composer run-script deploy:setup - 确认 CI 平台没默认加
--no-scripts(GitLab CI 的 Composer 模板有时会自带)
生产部署和 CI 安装的关键区别
CI 是为了跑测试,生产部署是为了上线,两者参数不能混用。CI 可以 --ignore-platform-reqs 图快,但生产必须严格校验环境;CI 可以装 dev 依赖跑测试,生产必须彻底排除。
- 生产命令底线:
composer install --no-dev --optimize-autoloader --classmap-authoritative --no-scripts --no-plugins - 漏掉
--classmap-authoritative,--optimize-autoloader就等于白开——PHP 仍会 fallback 到file_exists()探测,IO 开销照旧 - 漏掉
--no-dev,class_exists('PHPUnit\Framework\TestCase')这种运行时判断可能直接 fatal - 需要执行关键动作时,用
composer run-script deploy:xxx --no-dev,可控、可审计,不依赖隐式钩子
最易被忽略的是缓存 key 的构造方式:用 hashFiles('**/composer.lock') 而不是分支名或时间戳;还有 COMPOSER_MEMORY_LIMIT=-1 必须写在 composer install 命令之前,而不是塞进 PHP 参数里——多数 CI 镜像不认后者。










