5.5 KiB
category | name | contributors | filename | |||
---|---|---|---|---|---|---|
tool | Composer |
|
LearnComposer.sh |
Composer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.
Installing
# Installs the composer.phar binary into the current directory
curl -sS https://getcomposer.org/installer | php
# If you use this approach, you will need to invoke composer like this:
php composer.phar about
# Installs the binary into ~/bin/composer
# Note: make sure ~/bin is in your shell's PATH environment variable
curl -sS https://getcomposer.org/installer | php -- --install-dir=~/bin --filename=composer
Windows users should follow the Windows installation instructions
Confirming installation
# Check version and list options
composer
# Get more help for options
composer help require
# Check if Composer is able to do the things it needs, and if it's up to date
composer diagnose
composer diag # shorthand
# Updates the Composer binary to the latest version
composer self-update
composer self # shorthand
Usage
Composer stores your project dependencies in composer.json
. You can edit this file, but it is best to let Composer manage it for you.
# Create a new project in the current folder
composer init
# runs an interactive questionnaire asking you for details about your project. Leaving them blank is fine unless you are making other projects dependent on this one.
# If a composer.json file already exists, download the dependencies
composer install
# To download the just the production dependencies, i.e. excluding development dependencies
composer install --no-dev
# Add a production dependency to this project
composer require guzzlehttp/guzzle
# will figure out what the latest version of guzzlehttp/guzzle is, download it, and add the new dependency to composer.json's require field.
composer require guzzlehttp/guzzle:6.0.*
# will download the latest version matching the pattern (eg. 6.0.2) and add the dependency to composer.json's require field
composer require --dev phpunit/phpunit:~4.5.0
# will require as a development dependency. Will use the latest version >=4.5.0 and < 4.6.0
composer require-dev phpunit/phpunit:^4.5.0
# will require as a development dependency. Will use the latest version >=4.5.0 and < 5.0
# For more information on Composer version matching, see [Composer's documentation on Versions](https://getcomposer.org/doc/articles/versions.md) for more details
# To see what packages are available to install and currently installed
composer show
# To see what packages are currently installed
composer show --installed
# To find a package with 'mailgun' in its name or description
composer search mailgun
Packagist.org is the main repository for Composer packages. Search there for existing third-party packages.
composer.json
vs composer.lock
The composer.json
file stores your project's floating version preferences for each dependency, along with other information.
The composer.lock
file stores exactly which version it has downloaded for each dependency. Never edit this file.
If you include the composer.lock
file in your git repository, every developer will install the currently used version of the dependency. Even when a new version of a dependency is released, Composer will continue to download the version recorded in the lock file.
# If you want to update all the dependencies to their newest version still matching your version preferences
composer update
# If you want the new version of a particular dependency:
composer update phpunit/phpunit
# If you wish to migrate a package to a newer version preference, you may need to remove the older package and its dependencies first.
composer remove --dev phpunit/phpunit
composer require --dev phpunit/phpunit:^5.0
Autoloader
Composer creates an autoloader class you can require from your application. You can make instances of classes via their namespace.
require __DIR__ . '/vendor/autoload.php';
$mailgun = new Mailgun\Mailgun("key");
PSR-4 Autoloader
You can add your own namespaces to the autoloader.
In composer.json
, add a 'autoload' field:
{
"autoload": {
"psr-4": {"Acme\\": "src/"}
}
}
This will tell the autoloader to look for anything in the \Acme\
namespace within the src
folder.
You can also use PSR-0, a Classmap or just a list of files to include. There is also the autoload-dev
field for development-only namespaces.
When adding or modifying the autoload key, you will need to rebuild the autoloader:
composer dump-autoload
composer dump # shorthand
# Optimizes PSR0 and PSR4 packages to be loaded with classmaps too. Slow to run, but improves performance on production.
composer dump-autoload --optimize --no-dev
Composer's Cache
# Composer will retain downloaded packages to use in the future. Clear it with:
composer clear-cache
Troubleshooting
composer diagnose
composer self-update
composer clear-cache
Topics not (yet) covered in this tutorial
- Creating and distributing your own packages on Packagist.org or elsewhere
- Pre- and post- script hooks: run tasks when certain composer events take place