composer require 默认不走本地源是因为它优先查询 packagist.org,且仅当包名被某仓库显式声明支持时才查自定义源;需通过禁用 packagist、正确配置 path 仓库并指定版本约束,或使用 --repository-url 参数强制指定源。

composer require 为什么默认不走本地源
因为 composer require 默认只查 packagist.org,哪怕你已经配了 repositories,它也不会自动 fallback 到本地源——除非你明确告诉它“这个包就该从这儿装”。Composer 不会主动扫描所有仓库找匹配包,它按顺序查:先看 packagist.org(如果没关),再看自定义仓库,但前提是包名能被某个仓库“声明支持”。
怎么让 require 命令实际走本地源
核心是让 Composer 知道“这个包存在且只在本地源”,而不是去远程找。有三个可靠做法:
- 在
composer.json的repositories里把本地源设为packagist类型并关闭官方源:"packagist.org": false - 用
path类型仓库时,确保路径下有合法的composer.json,且name字段和你要require的完全一致(比如"myorg/mylib") - 执行
composer require myorg/mylib:dev-main时,必须带版本约束(哪怕只是dev-main),否则 Composer 仍可能去 packagist 查 latest stable
本地 path 仓库常见报错和修复
最典型的是:Could not find package myorg/mylib at any version,或者装完发现用的还是 packagist 上的老版本。原因往往不是配置错,而是:
-
repositories放在了项目级composer.json里,但没加"type": "path"和"url": "./packages/mylib"(路径必须是相对当前composer.json的) - 本地包的
composer.json缺少version字段,或用了dev-main却没启用"minimum-stability": "dev" - 运行
composer require前没清缓存:composer clear-cache,尤其换过仓库配置后
require 时指定仓库优先级的硬招
如果你只想对某一个包强制走本地源,又不想关掉 packagist,可以用 --repository-url 参数直连:
composer require myorg/mylib:dev-main --repository-url='{"type":"path","url":"./packages/mylib"}'
注意:--repository-url 接收的是 JSON 字符串,不是路径;单引号包裹防止 shell 解析错误;它会临时覆盖所有其他仓库,只用这一个。
这种写法绕过了 repositories 配置,适合 CI 或临时验证,但别写进脚本长期用——JSON 容易出引号嵌套问题,也难维护。
真正麻烦的不是配仓库,而是本地包的 autoload 和依赖解析是否干净。一旦本地包引用了外部包又没锁版本,require 过程可能突然切回 packagist 下载,而且不会警告。










