composer.json第一行必须是{且无bom、空行、注释或全角字符;name和type非强制但影响功能;require与require-dev须严格区分;description需非空英文动词开头,keywords应精准;validate和dump-autoload不可省略。

composer.json 从哪一行开始写才不报错
第一行必须是 {,不能有 BOM、空行、注释或 UTF-8 全角字符。常见错误是复制粘贴时带隐藏控制符,或用 Word/记事本保存导致引号变中文、缩进变 tab——结果 composer install 直接报 JSON decode error: Syntax error。
- 用 VS Code/Sublime/Vim 新建文件,编码选「UTF-8 without BOM」
- 所有键名和字符串值都必须用英文双引号包裹,比如
"name"、"php",不能写name或“php” - JSON 不支持尾随逗号:最后一项后别加逗号,
"require": { "php": "^8.1" }里"php": "^8.1"后面不能有逗号 - 写完立刻去
jsonlint.com校验,比反复试错快得多
name 和 type 字段到底要不要填
name 对私有项目不是强制字段,但漏填会导致 composer show 显示为空、某些插件无法识别上下文;type 不填默认是 "library",但如果你在写 Laravel 应用或 WordPress 插件,不填就等于放弃自动安装路径(比如 type: "wordpress-plugin" 会让包直接落到 wp-content/plugins/)。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 内部项目可省略
name,但建议填,格式为"vendor/project-name"(全小写、用短横线分隔),避免后期补填时触发校验失败 -
type按真实用途填:"project"(完整应用)、"laravel-package"(Laravel 扩展)、"wordpress-plugin"(WP 插件);不确定就先不填,别为了“看起来完整”乱设 - 如果后续要用 Packagist,
name和description必须非空且合法,否则提交失败
require 和 require-dev 划分不清的后果
把运行时必需的包(如 doctrine/orm)塞进 require-dev,本地测试正常,上线直接 Class not found;反过来把开发工具(如 phpunit/phpunit)放进 require,生产环境会多装一堆无用类,还可能引发 autoloader 冲突。
-
require:代码执行时真会include或 autoload 的依赖,比如日志、数据库、HTTP 客户端 -
require-dev:只在写代码、跑测试、生成文档时需要的工具,CI 环境加--no-dev就不会装 - 部署前务必确认:
composer install --no-dev能成功,并且关键类仍可加载
description 和 keywords 怎么写才被 Packagist 索引到
description 必须是非空英文字符串、动词开头、≤120 字符,否则 Packagist 页面显示 “No description”,且该包根本不出现在搜索结果里;keywords 是搜索加权核心,但填泛词(如 "php"、"tool")等于主动降权。
-
description示例:"Generates and validates ULID and UUID v4, no framework dependencies"(不能写中文,哪怕 README.md 是中文) -
keywords填 3–5 个真实搜索词,全小写、不含空格,含短横线要加引号:"psr-7";禁用"acme"(包名已有)、"library"(毫无区分度) - 本地验证命令:
composer validate --strict会明确报错description is missing or empty
autoload 块,也得手动运行 composer dump-autoload 才生效;而 composer install 在没有 vendor/ 目录时,不管有没有依赖都必须执行一次——它不只是装包,更是生成 autoload.php 和基础结构。










