composer.json 的 name 字段必须为小写 vendor/name 格式,如 "acme/http-client";version 在 path 仓库中无效,需用分支名如 "dev-main";autoload 必须正确配置 psr-4;type 影响框架自动发现。

composer.json 的 name 字段必须是 vendor/name 格式
这是 Composer 识别包的唯一标识,不是“起个名字就行”。如果写成 my-utils 或 Utils,哪怕路径、版本都对,composer require 也会报 “Could not find package”。
常见错误现象:composer require acme/utils 失败,但本地包 composer.json 里写的是 "name": "acmeutils"(缺斜杠)或 "Name": "Acme/Utils"(大小写不一致或字段名拼错)。
- 必须严格为小写字母 + 数字 + 连字符 + 斜杠,如
"acme/http-client" - vendor 名建议与 GitHub 用户名或组织名一致,避免后续发布到 Packagist 时被拒
- 不能包含空格、下划线、大写字母——Composer 解析时会直接跳过该文件,且不报错
version 字段在 path 仓库中基本无效,改用分支名约束
当你用 repositories 配 path 类型源时,Composer 不读取本地包 composer.json 中的 version 字段,只看 Git 当前 HEAD 所在分支。所以写 "version": "1.0.0" 没用,require 时还必须用 dev-main 这类分支名。
典型错误:本地包在 main 分支,composer.json 里写了 "version": "dev-main",但 require 却写 "acme/utils": "^1.0" —— 这会失败,因为 path 源不支持语义化版本匹配。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- require 时必须显式写
"acme/utils": "dev-main"(分支名需与实际 Git 分支完全一致) - 本地包目录必须已执行
git init且至少有一个 commit,否则 Composer 直接忽略该路径 - 如果想临时测试非 main 分支,先
git checkout -b dev-test,再composer update acme/utils
autoload 配置决定类能否被自动加载
没配 autoload,new AcmeUtilsHelper() 就会报 Class not found,哪怕文件物理存在。PSR-4 是最常用也最稳妥的选择。
常见错误现象:代码能 require 成功、vendor 目录也生成了,但一调用就报找不到类——大概率是 autoload 的命名空间或路径映射写错了。
-
"psr-4": { "Acme\Utils\": "src/" }表示src/Helper.php对应AcmeUtilsHelper - 命名空间末尾必须带双反斜杠
\,写成"AcmeUtils"或"Acme/Utils/"都会失效 - 路径是相对于包根目录(即含
composer.json的目录)的,不是相对于主项目
type 字段影响 Laravel/ThinkPHP 等框架的自动发现
如果你的包要作为 Laravel Service Provider 或 ThinkPHP 扩展被自动注册,type 就不是可选项。框架通过它判断是否启用自动发现机制。
例如 Laravel 要求 "type": "library" 是默认值,但如果是服务提供者包,应设为 "type": "laravel-package";ThinkPHP 推荐 "type": "think-package"。
- 不写
type或写错类型,php artisan vendor:publish或php think package:install可能完全不识别你的包 - 自定义
type值需配合对应框架的发现逻辑,不能凭空造一个 - 纯工具类库可省略,但一旦涉及配置发布、命令注册、中间件绑定,就必须按框架规范设值
composer.json 里生效,但它们只有在主项目正确声明 repositories 并 require 后,才被 Composer 加载和校验**。少一个环节,前面写的全白费。










