root package指项目根目录下包含composer.json的自身项目,如my-vendor/my-project;它声明依赖、定义自动加载、设置脚本钩子并控制整体行为,与vendor中第三方依赖包不同,是Composer操作的核心主体。

在 Composer 中,“root package” 指的是你正在开发的那个项目本身,也就是包含 composer.json 文件的这个项目。它不是某个依赖库,而是项目的顶层定义。
什么是 root package?
当你在一个 PHP 项目中创建了 composer.json 文件,这个项目就被称为 root package。它描述了当前项目的基本信息,比如名称、版本、依赖、自动加载规则等。例如:
{ "name": "my-vendor/my-project", "description": "A sample project", "require": { "monolog/monolog": "^2.0" }, "autoload": { "psr-4": { "MyProject\\": "src/" } } }这里的 my-vendor/my-project 就是 root package,而 monolog/monolog 是它的一个依赖包。
root package 的作用
root package 决定了整个项目的依赖结构和行为方式,主要体现在以下几个方面:
GNU makefile中文手册 pdf,文比较完整的讲述GNU make工具,涵盖GNU make的用法、语法。同时重点讨论如何为一个工程编写Makefile。阅读本书之前,读者应该对GNU的工具链和Linux的一些常用编程工具有一定的了解。诸如:gcc、as、ar、ld、yacc等本文比较完整的讲述GNU make工具,涵盖GNU make的用法、语法。重点讨论如何使用make来管理软件工程、以及如何为工程编写正确的Makefile。 本手册不是一个纯粹的语言翻译版本,其中对GNU make的一些语法
- 声明依赖:通过 require 和 require-dev 字段指定需要安装的第三方库。
- 定义自动加载:设置 PSR-4、PSR-0 或 classmap 等自动加载规则,让自己的代码能被正确加载。
- 脚本钩子:可以定义 post-install-cmd、pre-update-dump 等脚本,在特定时机执行命令。
- 版本控制自身:虽然大多数时候 root package 不会被发布到 Packagist,但它仍然有版本(如 dev-main、1.0.0),其他项目在依赖它时会用到。
与依赖包的区别
Composer 安装的所有第三方库(如 symfony/http-foundation、laravel/framework)都叫 dependency packages,它们的信息来自各自的 composer.json,但运行在你的项目之下。而 root package 是“你写的那个项目”,它的配置优先级最高。
举个例子:如果你在 root package 中禁用了某些脚本执行,即使某个依赖包希望运行 post-install-cmd,也可能不会生效,因为 root 可以控制整体行为。
常见误解澄清
- root package 不一定叫 "app":名字可以任意,只要它是项目根目录下的 composer.json 所定义的包。
- 没有 name 字段也可以:匿名 root package 是允许的(通常用于私有项目),但发布到 Packagist 时必须有 name。
- vendor 目录里的都不是 root package:所有 vendor 下的包都是依赖项,只有项目根目录下的才是 root。
基本上就这些。理解 root package 的关键在于:它是你正在开发的项目本身,是 Composer 命令操作的主体。所有依赖围绕它展开,配置也由它主导。不复杂但容易忽略。









