必须执行composer config -g repo.packagist验证,正确输出为{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};空、null、纯url或仍为packagist.org均说明未生效,常见原因包括键名错(如repos.packagist)、缺type值、url末尾无/、ci中用户权限不匹配。

确认镜像源是否真生效
执行 composer config -g repo.packagist,输出必须是完整 JSON 对象,形如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。空值、null、纯 URL 字符串、或仍是 https://packagist.org,都说明没生效。
常见失效原因:
- 键名写成
repos.packagist(多一个s) - 漏掉
"type": "composer"字段 - URL 末尾缺
/(如https://mirrors.tuna.tsinghua.edu.cn/composer不行,必须是https://mirrors.tuna.tsinghua.edu.cn/composer/) - CI 脚本里用
sudo composer config -g,结果写进了root的配置,但 runner 用户读不到;应确保以当前用户身份执行
验证是否真走镜像:加 -vvv 运行 composer install,日志中出现 GET https://mirrors.aliyun.com/composer/p2/... 才算成功。
项目级配置比全局更可靠
在项目根目录运行 composer config repo.packagist composer https://mirrors.tuna.tsinghua.edu.cn/composer/,它会自动往 composer.json 的 repositories 字段安全追加,不覆盖已有私有源。
注意前提:
- 如果
composer.json原本是"repositories": [](数组),命令会报错;需先手动改成"repositories": {}(对象)再执行 - 千万别手写
"packagist": false——这会彻底关掉基础包源,镜像临时不可用时,composer install直接失败 - 改完后建议跑一次
composer update --lock,确保composer.lock记录新源地址
缓存 ~/.composer/cache,别碰 vendor/
vendor/ 缓存看似快,实则危险:不同 PHP 版本、扩展开关(如 ext-apcu)、甚至文件系统大小写敏感性,都会导致生成的 autoload 文件不兼容,上线后随机报 Class not found 或 Cannot declare class。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
真正该缓存的是 ~/.composer/cache——它只存 zip/dist 包,与环境完全解耦,只跟 composer.lock 哈希绑定。
CI 配置示例:
- GitHub Actions:
path: ~/.composer/cache,key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.lock') }} - GitLab CI:
cache: key: ${PHP_VERSION}-composer-cache; paths: - ~/.composer/cache
缓存失效最常见原因:本地生成了新 composer.lock 但没提交,导致 key 不匹配。
CI 中必须带的 install 参数组合
composer install 在 CI 里裸跑,大概率线上出问题。漏一不可:
-
--no-dev:跳过require-dev中的包(如phpunit),否则可能把测试工具打进生产环境 -
--optimize-autoloader(或-o):生成vendor/composer/autoload_classmap.php,绕过 PSR-4 运行时扫描,类加载提速 50% 以上 -
--classmap-authoritative:强制 autoloader 完全信任 classmap,不再 fallback 到file_exists()探测——这是防止Class not found的最后一道防线 -
--no-interaction和--no-progress:禁用交互提示和进度条,避免流水线卡住
注意:--classmap-authoritative 必须与 --no-dev 同时使用;否则 dev 类虽不装,运行时判断仍会触发 fatal。
另外,CI 开头务必加 composer validate --strict,校验 composer.json 和 composer.lock 是否匹配;没提交 composer.lock,CI 应直接失败。










