2012-02-19 21:31:04 +00:00
# Repositories
2012-02-20 10:08:18 +00:00
This chapter will explain the concept of packages and repositories, what kinds
of repositories are available, and how they work.
2012-02-19 21:31:04 +00:00
## Concepts
2012-02-20 10:08:18 +00:00
Before we look at the different types of repositories that we can have, we
need to understand some of the basic concepts that composer is built on.
2012-02-19 21:31:04 +00:00
### Package
2012-02-20 10:08:18 +00:00
Composer is a dependency manager. It installs packages. A package is
essentially just a directory containing something. In this case it is PHP
code, but in theory it could be anything. And it contains a package
description which has a name and a version. The name and the version are used
to identify the package.
2012-02-19 21:31:04 +00:00
2012-02-20 10:08:18 +00:00
In fact, internally composer sees every version as a separate package. While
this distinction does not matter when you are using composer, it's quite
important when you want to change it.
2012-02-19 21:31:04 +00:00
2012-02-20 10:08:18 +00:00
In addition to the name and the version, there is useful data. The only really
important piece of information is the package source, that describes where to
get the package contents. The package data points to the contents of the
package. And there are two options here: dist and source.
2012-02-19 21:31:04 +00:00
2012-02-20 10:08:18 +00:00
**Dist:** The dist is a packaged version of the package data. Usually a
released version, usually a stable release.
2012-02-19 21:31:04 +00:00
2012-02-20 10:08:18 +00:00
**Source:** The source is used for development. This will usually originate
from a source code repository, such as git. You can fetch this when you want
to modify the downloaded package.
2012-02-19 21:31:04 +00:00
2012-02-20 10:08:18 +00:00
Packages can supply either of these, or even both. Depending on certain
factors, such as user-supplied options and stability of the package, one will
be preferred.
2012-02-19 21:31:04 +00:00
### Repository
2012-02-20 10:08:18 +00:00
A repository is a package source. It's a list of packages, of which you can
pick some to install.
2012-02-19 21:31:04 +00:00
2012-02-20 10:08:18 +00:00
You can also add more repositories to your project by declaring them in
`composer.json` .
2012-02-19 21:31:04 +00:00
## Types
### Composer
2012-02-20 10:08:18 +00:00
The main repository type is the `composer` repository. It uses a single
`packages.json` file that contains all of the package metadata. The JSON
format is as follows:
2012-02-19 21:31:04 +00:00
```json
{
"vendor/packageName": {
"name": "vendor/packageName",
"description": "Package description",
"versions": {
"master-dev": { @composer .json },
"1.0.0": { @composer .json }
}
}
}
```
2012-02-20 10:08:18 +00:00
The `@composer.json` marker would be the contents of the `composer.json` from
that package version including as a minimum:
2012-02-19 21:31:04 +00:00
* name
* version
* dist or source
Here is a minimal package definition:
```json
{
"name": "smarty/smarty",
"version": "3.1.7",
"dist": {
"url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
"type": "zip"
}
}
```
It may include any of the other fields specified in the [schema].
2012-02-20 10:08:18 +00:00
The `composer` repository is also what packagist uses. To reference a
`composer` repository, just supply the path before the `packages.json` file.
In case of packagist, that file is located at `/packages.json` , so the URL of
the repository would be `http://packagist.org` . For
`http://example.org/packages.org` the repository URL would be
`http://example.org` .
2012-02-19 21:31:04 +00:00
### VCS
2012-02-20 10:08:18 +00:00
VCS stands for version control system. This includes versioning systems like
git, svn or hg. Composer has a repository type for installing packages from
these systems.
2012-02-20 00:04:35 +00:00
2012-02-20 10:08:18 +00:00
There are a few use cases for this. The most common one is maintaining your
own fork of a third party library. If you are using a certain library for your
project and you decide to change something in the library, you will want your
project to use the patched version. If the library is on GitHub (this is the
case most of the time), you can simply fork it there and push your changes to
your fork. After that you update the project's `composer.json` . All you have
to do is add your fork as a repository and update the version constraint to
point to your custom branch.
2012-02-20 00:04:35 +00:00
Example assuming you patched monolog to fix a bug in the `bugfix` branch:
```json
{
"repositories": [
{
"type": "vcs",
"url": "http://github.com/igorw/monolog"
}
],
"require": {
"monolog/monolog": "dev-bugfix"
}
}
```
2012-02-20 10:08:18 +00:00
When you run `php composer.phar update` , you should get your modified version
of `monolog/monolog` instead of the one from packagist.
2012-02-20 00:04:35 +00:00
2012-02-20 10:08:18 +00:00
Git is not the only version control system supported by the VCS repository.
The following are supported:
2012-02-20 00:04:35 +00:00
* **Git:** [git-scm.com ](http://git-scm.com )
* **Subversion:** [subversion.apache.org ](http://subversion.apache.org )
* **Mercurial:** [mercurial.selenic.com ](http://mercurial.selenic.com )
2012-02-20 10:08:18 +00:00
To use these systems you need to have them installed. That can be
invonvenient. And for this reason there is special support for GitHub and
BitBucket that use the APIs provided by these sites, to fetch the packages
without having to install the version control system. The VCS repository
provides `dist` s for them that fetch the packages as zips.
2012-02-20 00:04:35 +00:00
* **GitHub:** [github.com ](https://github.com ) (Git)
* **BitBucket:** [bitbucket.org ](https://bitbucket.org ) (Git and Mercurial)
The VCS driver to be used is detected automatically based on the URL.
2012-02-19 21:31:04 +00:00
### PEAR
2012-02-20 13:22:16 +00:00
It is possible to install packages from any PEAR channel by using the `pear`
repository. Composer will prefix all package names with `pear-{channelName}/` to
avoid conflicts.
Example using `pear2.php.net` :
```json
{
"repositories": [
{
"type": "pear",
"url": "http://pear2.php.net"
}
],
"require": {
"pear-pear2/PEAR2_HTTP_Request": "*"
}
}
```
In this case the short name of the channel is `pear2` , so the
`PEAR2_HTTP_Request` package name becomes `pear-pear2/PEAR2_HTTP_Request` .
> **Note:** The `pear` repository requires doing quite a few requests per
> package, so this may considerably slow down the installation process.
2012-02-19 21:31:04 +00:00
### Package
2012-02-20 13:22:16 +00:00
If you want to use a project that does not support composer through any of the
means above, you still can define the package yourself using a `package`
repository.
Basically, you define the same information that is included in the `composer`
repository's `packages.json` , but only for a single package. Again, the
minimally required fields are `name` , `version` , and either of `dist` or
`source` .
Here is an example for the smarty template engine:
```json
{
"repositories": [
{
"type": "package",
"package": {
"name": "smarty/smarty",
"version": "3.1.7",
"dist": {
"url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
"type": "zip"
},
"source": {
"url": "http://smarty-php.googlecode.com/svn/",
"type": "svn",
"reference": "trunk"
}
}
}
],
"require": {
"smarty/smarty": "3.1.*"
}
}
```
Typically you would leave the source part off, as you don't really need it.
2012-02-20 00:04:35 +00:00
## Hosting your own
2012-02-20 14:32:22 +00:00
While you will probably want to put your packages on packagist most of the time, there are some use cases for hosting your own repository.
* **Private company packages:** If you are part of a company that uses composer for their packages internally, you might want to keep those packages private.
* **Separate ecosystem:** If you have a project which has its own ecosystem, and the packages aren't really reusable by the greater PHP community, you might want to keep them separate to packagist. An example of this would be wordpress plugins.
When hosting your own package repository it is recommended to use a `composer` one. This is type that is native to composer and yields the best performance.
There are a few different tools that can help you create a `composer` repository.
### Packagist
The underlying application used by packagist is open source. This means that you can just install your own copy of packagist, re-brand, and use it. It's really quite straight-forward to do.
Packagist is a Symfony2 application, and it is [available on GitHub ](https://github.com/composer/packagist ). It uses composer internally and acts as a proxy between VCS repositories and the composer users. It holds a list of all VCS packages, periodically re-crawls them, and exposes them as a composer repository.
To put set your own copy, simply follow the instructions from the [packagist github repository ](https://github.com/composer/packagist ).
### Satis
Satis is a static `composer` repository generator. It is a bit like a ultra-lightweight, file-based version of packagist.
You give it a `composer.json` containing repositories, typically VCS and package repository definitions. It will fetch all the packages from these repositories and dump a `packages.json` that is your `composer` repository.
Check [the satis GitHub repository ](https://github.com/composer/satis ) for more information.