因为composer默认不扫描本地目录,必须在composer.json中配置type为path的repositories,并确保url是相对路径、包内composer.json的name和version与require命令一致,否则无法识别。

为什么 composer require 找不到本地包?
因为 Composer 默认只从 packagist.org 或你显式配置的远程仓库拉取,./packages/my-utils 这种本地目录它压根不看——除非你主动告诉它“这里有个仓库”。常见错误是直接把包放进去就跑 composer require mycompany/utils,结果报错 Could not find package mycompany/utils。
必须在项目根目录的 composer.json 里加 repositories 配置,且 type 得设为 path:
{
"repositories": [
{
"type": "path",
"url": "./packages/my-utils"
}
]
}
-
url必须是相对路径,且不能跨出项目根目录(比如../my-utils会被 Composer 拒绝) - 改完后要执行
composer require mycompany/utils:dev-main,其中dev-main必须和包内composer.json的"version"或分支名一致 - 运行
composer show mycompany/utils确认输出里有source: path,否则说明没识别成本地包,可能被当成 dist 包去远程下载了
autoload 不生效?先查命名空间和路径是否对得上
Class 'MyCompanyUtilsHelper' not found 这类错误,90% 不是 Composer 没装好,而是 PSR-4 自动加载链断了。Composer 只负责把类文件映射进 autoloader,但前提是包自己的 composer.json 里 autoload 配置和实际文件结构严格匹配。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 包内
composer.json必须有类似这样的 autoload 声明:"autoload": { "psr-4": { "MyCompany\Utils\": "src/" } } - 对应类文件得放在
./packages/my-utils/src/Helper.php,且类声明是namespace MyCompanyUtils; - 每次改了
autoload或移动了类文件,都得先composer remove mycompany/utils,再composer require重装——composer dump-autoload对已安装的本地包无效 - 如果包用了 Laravel 的
ServiceProvider或Facade,记得手动在config/app.php里注册,Composer 不管这部分
生产环境千万别用 path 类型仓库
path 类型只适合开发调试,上线部署时必须换成 vcs(Git)或私有 composer 仓库。原因很实在:
- Docker 构建或 CI 流水线里,
./packages/my-utils路径根本不存在,composer install直接失败 - 团队协作时,别人 clone 项目后没有你的本地包目录,
composer update会卡住或回退到远程源 - Git 提交时容易漏掉
repositories配置,导致不同人环境行为不一致 - 上线前务必运行
composer config --unset repositories.my-local清理掉本地配置,否则可能覆盖正式仓库源
离线场景下,用 artifact 替代 path
当开发机没网、或需要打包交付给客户时,path 就不适用了——它依赖文件系统挂载,而 artifact 是 Composer 原生支持的离线方案:把包打成 .tar 或 .zip,让 Composer 当“本地 Packagist”用。
- 每个压缩包命名必须严格为
vendor/name-version.tar(如mycompany/utils-1.0.0.tar),且包内composer.json的name和version要与文件名一致 - 压缩包内路径不能带根目录(比如不要
/src/Helper.php,而要src/Helper.php),否则解压后 autoload 失败 - 配置方式:
composer config repositories.offline '{"type":"artifact","url":"/path/to/artifacts/"}',路径建议用相对路径 - 首次
composer install会解压所有匹配包,不发任何 HTTP 请求;但 artifacts 目录必须预装全量依赖,不支持按需拉取
真正容易被忽略的是:artifact 仓库要求每个包的压缩包里必须包含完整的 composer.json,且 autoload 字段不能缺失——少一个字段,整个包就不可用。










