要让别人能 composer require 你的包,必须遵循 psr-4 规范并正确配置 autoload:src/ 必须存在且与命名空间严格匹配;tests/ 仅用于测试、不参与 autoload;bin/ 需在 composer.json 中显式声明;vendor/ 和 composer.lock 绝对不可提交。

想让别人能 composer require 你的包,目录结构本身没强制要求,但 Packagist 和主流项目只认 PSR-4 + 明确的 autoload 配置 —— 其他结构再漂亮,require 不进去就是废包。
src/ 必须存在,且必须和 autoload 的路径对得上
Composer 不扫描目录,它只按 composer.json 里写的 autoload 路径去加载类。如果你写 "MyVendor\Package\": "src/",那 src/ 就是硬性起点,里面必须有对应命名空间的子目录或文件。
- 错误示例:
src/Calculator.php里声明namespace MyVendorPackage;,但 autoload 写的是"MyVendor\Package\": "src/"→ 自动加载器会去找src/Package/Calculator.php,找不到就报Class not found - 正确做法:要么改命名空间为
MyVendor\Package,要么把 autoload 改成"MyVendorPackage\": "src/"(注意结尾没反斜杠) - 别在
src/下混放配置、迁移、视图等非类文件 —— PSR-4 加载器会递归扫描整个目录,拖慢autoload性能
tests/ 是事实标准,但不参与 autoload
tests/ 目录本身不会被 Composer 加载,它的存在只是为了表明你写了测试,且方便 CI 工具(如 PHPUnit)自动发现用例。关键点在于:它不能出现在 autoload 或 autoload-dev 的路径里,除非你真想把测试类暴露给生产代码。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果你用了
autoload-dev,比如"MyVendor\Package\Test\": "tests/",那composer install --no-dev时这些路径仍会被写入 autoloader,只是不装 dev 包 —— 这属于设计失误 - 推荐写法:只在
autoload-dev里加测试用的辅助类(如tests/Support/TestCase.php),核心测试用例文件(tests/Unit/CalculatorTest.php)不进 autoload - CI 中跑测试前,确保
composer install(不带--no-dev),否则autoload-dev规则不生效
bin/ 目录要显式声明,否则命令不可用
Composer 不会自动识别 bin/ 下的脚本。想让用户执行 mytool 命令,必须在 composer.json 里用 bin 字段明说:
"bin": ["bin/mytool"]
-
bin/mytool文件必须有可执行权限(chmod +x bin/mytool),且首行是#!/usr/bin/env php - 如果脚本依赖当前包的类,它得自己
require __DIR__.'/../vendor/autoload.php'—— Composer 不会自动注入 - 别把
bin/放进autoload,它不是 PHP 类,加载了也没用
vendor/ 和 composer.lock 绝对不能提交到你的包仓库
你的包是给别人 require 的,不是拿来直接运行的。提交 vendor/ 或 composer.lock 会导致两个问题:
- 别人
composer require your/package时,Composer 会忽略你锁文件里的版本,但会继承你vendor/里已有的、可能冲突的依赖副本,引发难以复现的加载错误 - Packagist 在抓取你的包时,会跳过
vendor/和composer.lock,但若它们存在于 Git 仓库,CI 构建或本地开发时容易误用 - 正确做法:在包的
.gitignore里明确写上/vendor和/composer.lock,CI 流水线也禁止上传这两个东西
最容易被忽略的一点:命名空间末尾的反斜杠要不要写,直接影响 PSR-4 解析逻辑。写 "MyVendor\Package\": "src/" 表示找 src/Package/ 下的类;写 "MyVendor\Package": "src/"(没反斜杠)表示找 src/ 下以 MyVendor\Package 开头的类 —— 这种写法极少用,且极易出错,别碰。










