This question already has answers here: What is the difference between require and require-dev sections in composer.json? (6 answers) Closed 4 years ago.
I'm new to the composer
and I would like to know the difference between require
and require-dev
. 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.
The 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.
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.json at the root of your project. It is the main composer.json that defines your project requirements.
…and the 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 vendor
folder).
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 phpunit
to 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 phpunit
.
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 phpunit
.
You can override this behaviour with the --dev
and --no-dev
options, but the default behaviour is based on whether the package concerned is the root package.
seems clear to me:
require Lists packages required by this package. The package will not be installed unless those requirements can be met. require-dev (root-only) 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 --dev or if update is run without --no-dev.
http://getcomposer.org/doc/04-schema.md
1. the packages used to develop a package
composer.json
file like "require-dev": { // this package('s) }
--dev
…" This has since been changed in the linked documentation to: "The dev requirements of the root package are installed by default." The above extract is out of date.
Success story sharing
require-dev
?composer install
(what composer terms the "root package"), but not for other packages installed as dependencies.require-dev
make Composer complain oncomposer update|require
for packages inrequire
?