答案是关掉默认源(composer config -g repo.packagist false)为白名单生效前提,否则仅新增源而非限制来源;必须严格使用repo.packagist键名、布尔false值,并显式声明每个可信仓库的type和url。

关掉默认源是白名单生效的前提
不执行 composer config -g repo.packagist false,所有后续配置都只是“多加一条源”,不是“只用这些源”。Packagist 默认行为是先查 https://packagist.org,找不到才 fallback 到你配的 repositories。想真正限制来源,必须先关掉它——键名只能是 repo.packagist,写成 repo.packagist.org 或 repositories.packagist 都无效。
执行后,composer require foo/bar 会直接报错 Package not found,这是正常现象。验证是否生效:运行 composer config -g -l | grep repo.packagist,应输出 repo.packagist=false。
- 该开关只在全局配置中生效,项目级
composer.json中的repositories不会恢复默认源 - 值必须为布尔
false,不能是null、空字符串或字符串"false" - 一旦启用,所有项目都受约束,除非你在每个项目里手动补全所需仓库
显式声明每个可信仓库,键名和 type 必须严格匹配
关掉默认源后,Composer 只查你 repositories 数组里明确列出的地址,且按顺序遍历,直到某个源返回该包的 composer.json。每个仓库需指定唯一键名(不能含点号)、type 和 url:
- 正确示例:
composer config -g repositories.aliyun type composer+composer config -g repositories.aliyun url https://mirrors.aliyun.com/composer/ - 错误示例:
composer config -g repositories.packagist.org url https://mirrors.tuna.tsinghua.edu.cn/composer/→ 这个仓库会被当成普通自定义源,无法接管默认行为 - 若某包仅存在于
packagist.org(比如小众私有包),需单独加回:composer config -g repositories.official type composer+composer config -g repositories.official url https://packagist.org
注意:键名(如 aliyun)是任意自定义标识符,与包名无关;但必须唯一,重复或非法字符会导致 Composer 静默跳过该条目。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
require 的包找不到?不是配置漏了,是包根本不在你声明的仓库里
关掉默认源后,Composer 不会自动探测包归属,也不会 fallback 到未声明的源。它只查你 repositories 里明确列出的那些地址。常见失败原因:
- 镜像源没同步最新版(如阿里云镜像延迟几小时),而你要的版本只在
packagist.org上有 - 配的 URL 不是完整 Composer 镜像(比如填了 GitHub 地址而非
https://mirrors.aliyun.com/composer/) - 没确认该包是否真在镜像中:打开
https://mirrors.aliyun.com/composer/p/vendor/name.json看能否访问
临时绕过:单次命令 composer require vendor/name --repository=https://packagist.org;长期方案:为该包所在组织加对应镜像源,比如 VuePress 用户应配 repositories.vuepress + 对应镜像 URL。
私有包或细粒度控制必须用 "type": "package"
想让私仓只提供 myorg/foo 和 myorg/bar,其他包一律不可见?别用 type: composer 或 type: vcs——它们会全量扫描 packages.json,导致泛匹配风险。唯一可靠方式是把私仓声明为 "type": "package",并为每个实际提供的包显式写出 name、version、dist 字段:
- 多个包就写多个条目,全部放在
repositories数组最前面,确保优先级最高 - 这种写法不会触发自动索引,完全由你控制可见范围
- 配合
repo.packagist=false,才能真正实现“非指定不拉取”
最容易被忽略的是:HTTPS 必须强制启用,HTTP 镜像或停更镜像会跳过签名验证,带来供应链投毒风险。白名单模式下,任一仓库使用 HTTP 协议,整套校验机制就形同虚设。

















