应使用composer create-project拉取标准模板而非composer init,因其预置合法name、autoload路径和PHP版本约束;composer init不校验vendor/name格式、src/末尾斜杠及php版本声明,任一缺失均导致Packagist拒收。

别用 composer init 起步做扩展包——它不校验 name 格式、autoload 路径末尾斜杠、PHP 版本约束,三项任一出错,Packagist 直接拒收。
为什么 composer init 生成的 composer.json 很可能发布失败
它默认把 name 设成 myapp,而 Packagist 强制要求 vendor/name(如 acme/utils);它允许你填 src 作为 PSR-4 路径,但实际必须是 "src/"(末尾斜杠不可省);它不提示加 "php": "^8.1" 到 require,导致 CI 拉错版本、class not found 或 Package name must be lowercase 报错。
这些不是“建议配置”,是 Packagist 接收和 Composer 解析的硬性门槛。交互式流程里没问你 autoload,不代表你可以不配——没配就等于你的类永远无法被自动加载。
用 composer create-project 拉标准模板更可靠
直接复用已验证的轻量骨架,比如 php-pkg/skeleton 或 orchestra/package-skeleton,它们预置了:
-
"type": "library"—— 扩展包类型,非project -
"autoload": {"psr-4": {"AcmeUtils": "src/"}}—— 命名空间与路径严格对齐,末尾斜杠已写死 -
"require": {"php": "^8.1"}—— PHP 版本显式约束,CI 可控
执行命令时注意三点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须指定目标目录:
composer create-project php-pkg/skeleton my-utils,避免覆盖当前项目 - 加
--no-interaction防止卡在交互环节(尤其 CI 中) - 进目录后立刻运行
composer dump-autoload -o,验证新结构下类是否可加载
如果非要用 composer init,必须手动补全这三处
交互完成后,别急着 composer install,先检查并修正:
-
name字段是否为小写vendor/name格式(不能含空格、大写字母、下划线开头) -
autoload是否存在且格式正确:例如"autoload": {"psr-4": {"MyLib\": "src/"}},注意命名空间末尾反斜杠和路径末尾正斜杠都不可少 -
require中是否显式声明了"php": "^8.1"(不能只写8.1,也不能漏掉)
然后运行 composer validate,它会直接指出邮箱格式错误、JSON 语法问题或字段缺失——这是唯一能提前暴露 Packagist 拒收原因的检查点。
依赖和开发依赖别混填,尤其是 phpunit
composer init 的交互流程只支持添加 require,require-dev 必须手动编辑或后续用 composer require --dev 补上。常见错误是把 phpunit/phpunit 填进 require,结果上线时多装一堆无用包,还可能因版本冲突导致 composer install 失败。
另一个坑是版本约束乱打:* 允许任意版本,dev-main 需配合 "minimum-stability": "dev",而 2.0.0(无符号)会锁死版本——生产环境应优先用 ^2.0 这类语义化版本。
最易被忽略的是:模板生成或 init 后,没人帮你检查 src/ 下的类是否真能被 new 实例化。哪怕 composer.json 看似合法,只要命名空间声明、文件路径、autoload 配置三者有一处错位,Class 'MyLibHello' not found 就会准时出现。

















