结论:不要手动写composer.json,用composer init交互式生成再微调,否则易漏autoload、minimum-stability或require-dev等关键字段,导致autoload失效或依赖安装失败。

直接说结论:不要手动写 composer.json,用 composer init 交互式生成再手动微调,否则极易漏掉 autoload、minimum-stability 或 require-dev 等关键字段,导致后续 autoload 失效或依赖安装失败。
为什么 composer init 比手写更可靠
手写 composer.json 容易忽略 schema 隐含约束:比如 type 字段不填默认是 library,但如果你实际在写 CLI 工具,不显式设为 project,某些打包工具(如 humbug/box)会跳过自动发现;又比如 autoload 缺失时,composer dump-autoload 不报错,但 new YourClass() 会直接 Class not found。
使用 composer init 能强制你回答包名、描述、作者、PHP 版本要求、依赖项等核心问题,并自动生成合规结构:
composer init # 会依次提示: # Package name (<vendor>/<name>) [username/project]: # Description []: # Author [<name> <email>]: # Minimum Stability []: stable # Package Type (library, project, metapackage, composer-plugin) []: library # License []: MIT # Define your dependencies.
- 输入
^8.1作为 PHP 版本要求,它会自动写成"php": "^8.1"并放入require - 若项目要发布到 Packagist,
vendor/name必须与你在 Packagist 注册的用户名一致,否则composer require无法解析 - 如果只是本地开发项目(非可复用库),
type建议设为project,避免被其他项目误require
autoload 字段必须按需显式配置
90% 的 “Class not found” 问题都源于 autoload 配置缺失或路径错误。Composer 不会自动扫描 src/ 或 lib/ 目录 —— 除非你告诉它。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
常见场景及写法:
- PSR-4 自动加载(推荐):
"autoload": { "psr-4": { "App\": "src/" } },注意末尾斜杠和命名空间结尾反斜杠必须存在 - 类文件集中放在
lib/且无命名空间?用files:"autoload": { "files": ["lib/helpers.php"] } - 开发时想边写边加载,别忘了加
autoload-dev:"autoload-dev": { "psr-4": { "App\Tests\": "tests/" } } - 改完
autoload后,必须运行composer dump-autoload才生效,install或update不会自动触发
require 和 require-dev 的边界必须清晰
混淆这两者会导致生产环境意外引入开发工具(如 phpunit),或测试时找不到调试依赖(如 symfony/var-dumper)。
-
require只放运行时必需的包,例如"monolog/monolog": "^3.0";框架类库(如laravel/framework)也属于此列 -
require-dev放测试、构建、分析工具:"phpunit/phpunit": "^10.0"、"phpstan/phpstan": "^1.10"、"friendsofphp/php-cs-fixer": "^3.14" - 执行
composer install --no-dev时,require-dev中的包完全不会安装,CI 流水线应默认加这个参数 - 如果某个包既用于开发又用于运行(如
symfony/dotenv在本地读 .env,生产可能不需要),优先放进require,再通过环境判断是否加载
最常被忽略的是 autoload 和 autoload-dev 的对应关系:写了 "App\Tests\": "tests/" 却没把 phpunit 放进 require-dev,或者写了 "psr-4" 却忘了运行 dump-autoload —— 这些都不是 Composer 的 bug,而是初始化阶段没把契约一次性对齐。

















