Composer — Dependency Manager for PHP
Practical guide to Composer — the dependency manager for PHP: install packages, manage versions and optimize autoloading.
Composer is the central dependency manager in the PHP world – it installs libraries, keeps their versions under control and generates the autoloading so you can use classes without writing manual require lines. Through Packagist, the central package registry, a few commands pull anything from Guzzle to the entire Laravel framework into your project. This guide walks you through everyday work: setting up a project, requiring and updating packages, steering versions with constraints and optimizing the autoloader for production.
Project Setup
composer init — Interactively create a new composer.json file in the current directory.
composer initcomposer init --name=<vendor>/<package> — Create a new composer.json with a predefined package name.
composer init --name=acme/my-projectcomposer create-project <package> <directory> — Create a new project from an existing package (like cloning + install).
composer create-project laravel/laravel my-appcomposer create-project <package> <directory> <version> — Create a new project from a specific version of a package.
composer create-project laravel/laravel my-app "11.*"Installing Packages
composer install — Install all dependencies defined in composer.lock (or composer.json if no lock file exists).
composer installcomposer install --no-dev — Install only production dependencies, skip require-dev packages.
composer install --no-devcomposer install --optimize-autoloader — Install dependencies and generate an optimized class map for autoloading.
composer install --optimize-autoloadercomposer install --no-scripts — Install dependencies without executing any scripts defined in composer.json.
composer install --no-scriptscomposer install --dry-run — Simulate the install without actually modifying anything.
composer install --dry-runRequiring Packages
composer require <package> — Add a package to require and install it.
composer require guzzlehttp/guzzlecomposer require <package>:<version> — Require a specific version or version constraint of a package.
composer require guzzlehttp/guzzle:^7.0composer require --dev <package> — Add a package as a development dependency (require-dev).
composer require --dev phpunit/phpunitcomposer require <package> --with-all-dependencies — Allow all dependencies (including already installed) to be updated when requiring.
composer require symfony/console --with-all-dependenciescomposer require <package> -W — Short form of --with-all-dependencies.
composer require laravel/framework -WUpdating Packages
composer update — Update all dependencies to the latest versions matching composer.json constraints.
composer updatecomposer update <package> — Update a single package to its latest allowed version.
composer update guzzlehttp/guzzlecomposer update <package1> <package2> — Update multiple specific packages at once.
composer update symfony/console symfony/http-foundationcomposer update --with-all-dependencies — Also update dependencies of the packages being updated.
composer update --with-all-dependenciescomposer update --no-dev — Update only production dependencies.
composer update --no-devcomposer update --dry-run — Preview what would be updated without actually making changes.
composer update --dry-runcomposer update --prefer-lowest — Update to the lowest possible versions matching constraints. Useful for testing compatibility.
composer update --prefer-lowestRemoving Packages
composer remove <package> — Remove a package from require and uninstall it.
composer remove guzzlehttp/guzzlecomposer remove --dev <package> — Remove a package from require-dev.
composer remove --dev phpunit/phpunitcomposer remove <package> --no-update — Remove a package from composer.json without updating the lock file.
composer remove monolog/monolog --no-updateInformation & Search
composer show — List all installed packages with their versions.
composer showcomposer show <package> — Show detailed information about a specific installed package.
composer show guzzlehttp/guzzlecomposer show --tree — Show installed packages as a dependency tree.
composer show --treecomposer show --outdated — List installed packages that have newer versions available.
composer show --outdatedcomposer show --direct — Show only directly required packages (not transitive dependencies).
composer show --directcomposer search <keyword> — Search for packages on Packagist by keyword.
composer search markdown parsercomposer depends <package> — Show which packages depend on a given package (reverse dependency lookup).
composer depends psr/logcomposer why <package> — Alias for depends. Show why a package is installed.
composer why symfony/polyfill-mbstringcomposer why-not <package> <version> — Show why a package cannot be updated to a specific version.
composer why-not laravel/framework 11.0Lock File & Autoloader
composer dump-autoload — Regenerate the autoloader files without installing or updating packages.
composer dump-autoloadcomposer dump-autoload --optimize — Generate an optimized autoloader with a class map for better performance.
composer dump-autoload --optimizecomposer dump-autoload --classmap-authoritative — Only use class map for autoloading. Fastest but won't find new classes automatically.
composer dump-autoload --classmap-authoritativecomposer validate — Validate the composer.json and composer.lock files for errors.
composer validatecomposer validate --strict — Validate with strict checks. Returns non-zero exit code on warnings too.
composer validate --strictVersion Constraints
composer require <package>:^<version> — Caret constraint. Allow updates that don't change the leftmost non-zero digit (recommended).
composer require guzzlehttp/guzzle:^7.5composer require <package>:~<version> — Tilde constraint. Allow updates to the last specified digit only.
composer require monolog/monolog:~2.0composer require <package>:<exact_version> — Require an exact version. No updates allowed.
composer require phpunit/phpunit:10.5.3composer require <package>:">=<min> <<max>" — Use a version range with comparison operators.
composer require monolog/monolog:">=2.0 <3.0"composer require <package>:* — Wildcard constraint. Allow any version (not recommended for production).
composer require acme/internal-lib:*composer require <package>:dev-<branch> — Require a specific branch (development version) of a package.
composer require acme/lib:dev-mainScripts & Hooks
composer run-script <script> — Run a script defined in the scripts section of composer.json.
composer run-script testcomposer run <script> — Short alias for run-script.
composer run lintcomposer run-script --list — List all available scripts defined in composer.json.
composer run-script --listcomposer exec <binary> — Execute a binary from the vendor/bin directory.
composer exec phpunit -- --filter=MyTestGlobal Packages
composer global require <package> — Install a package globally (available system-wide).
composer global require laravel/installercomposer global show — List all globally installed packages.
composer global showcomposer global update — Update all globally installed packages.
composer global updatecomposer global remove <package> — Remove a globally installed package.
composer global remove laravel/installerCache & Diagnostics
composer clear-cache — Clear the internal package cache.
composer clear-cachecomposer diagnose — Run diagnostic checks for common issues (connectivity, permissions, etc.).
composer diagnosecomposer self-update — Update Composer itself to the latest version.
composer self-updatecomposer self-update --rollback — Rollback to the previously installed version of Composer.
composer self-update --rollbackcomposer config --list — List all current configuration values.
composer config --listcomposer config --global home — Show the Composer home directory path.
composer config --global homeRepositories & Platforms
composer config repositories.<name> vcs <url> — Add a VCS (Git) repository as a package source.
composer config repositories.my-lib vcs https://github.com/acme/my-lib.gitcomposer config repositories.<name> path <path> — Add a local path repository for development.
composer config repositories.local-lib path ../my-libcomposer config repositories.<name> '{"type": "composer", "url": "<url>"}' — Add a private Composer repository (e.g. Private Packagist, Satis).
composer config repositories.private '{"type": "composer", "url": "https://packages.example.com"}'composer config platform.php <version> — Fake the PHP version for dependency resolution (useful for deployment targeting).
composer config platform.php 8.2.0 Conclusion
Composer takes the tedium out of managing PHP dependencies – and the key to reproducible builds is the composer.lock file. Keep the distinction clear: composer update re-resolves versions and rewrites the lock file, while composer install installs exactly the versions pinned there. In production you should therefore almost always run only install and leave update to local development. For deployments, reach for --no-dev and an optimized autoloader (-o or --optimize-autoloader) so no testing tools and no needless overhead end up on the server. Bear in mind that Composer scripts and plugins execute arbitrary code – with untrusted packages, --no-scripts is a sensible safeguard, and secure-http (the default) should stay enabled so packages are only ever fetched over HTTPS.
Further Reading
- Composer documentation – official guide and command reference
- Packagist – the central package registry for PHP
- Versions and constraints – in-depth explanation of version constraints