What's the difference between require and require-dev?
I'm new to the
composer and I would like to know the difference between
The composer website doesn't offer a good explanation the difference between these two.
The part that I don't get is
Lists packages required for developing this package, or running tests, etc. from Composer Official Docs.
Verified Answer (227 Votes) ✓
require-dev packages are packages that aren't necessary for your project to work and shouldn't be included in the production version of your project.
Typically, these are packages such as
phpunit/phpunit that you would only use during development.
Answer #2 (55 Votes)
seems clear to me:
Lists packages required by this package. The package will not be installed unless those requirements can be met.
Lists packages required for developing this package (1), or running tests, etc. The dev requirements of the root package only will be installed if install is run with
--devor if update is run without
1. the packages used to develop a package
Answer #3 (45 Votes)
The key distinction is that Composer will only install
require-dev dependencies for the "root package" – the directory where you run
composer install. The documentation describes this as:
The root package is the package defined by the
composer.jsonat the root of your project. It is the main
composer.jsonthat defines your project requirements.
require-dev documentation specifies that it is "root-only".
In practice, this means that a package's
require-dev dependencies aren't used if the package is being installed as a dependency for something else (ie it's installed to another project's
So if you have
phpunit in the
require-dev list for YourProject, and I clone down YourProject and run
composer install in the
yourproject/ directory, Composer will install
yourproject/vendor/, because it's likely I'm doing some development on YourProject. As part of doing development I'll probably want to run YourProject's test suite, and to do that I'll need
But, if I add YourProject as a dependency of MyProject, installing the
myproject package will install the
yourproject package as well, but it will not install
You can override this behaviour with the
--no-dev options, but the default behaviour is based on whether the package concerned is the root package.