2014-07-20 16:47:10 +00:00
|
|
|
# The composer.json Schema
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-04-13 12:35:13 +00:00
|
|
|
This chapter will explain all of the fields available in `composer.json`.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
## JSON schema
|
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
We have a [JSON schema](http://json-schema.org) that documents the format and
|
|
|
|
can also be used to validate your `composer.json`. In fact, it is used by the
|
2012-02-26 11:40:35 +00:00
|
|
|
`validate` command. You can find it at:
|
2012-04-13 12:35:13 +00:00
|
|
|
[`res/composer-schema.json`](https://github.com/composer/composer/blob/master/res/composer-schema.json).
|
|
|
|
|
|
|
|
## Root Package
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
Certain fields only apply when in the root package context. One example of
|
|
|
|
this is the `config` field. Only the root package can define configuration.
|
|
|
|
The config of dependencies is ignored. This makes the `config` field
|
|
|
|
`root-only`.
|
|
|
|
|
2012-07-20 18:38:46 +00:00
|
|
|
> **Note:** A package can be the root package or not, depending on the context.
|
|
|
|
> For example, if your project depends on the `monolog` library, your project
|
|
|
|
> is the root package. However, if you clone `monolog` from GitHub in order to
|
|
|
|
> fix a bug in it, then `monolog` is the root package.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
## Properties
|
|
|
|
|
|
|
|
### name
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
The name of the package. It consists of vendor name and project name,
|
|
|
|
separated by `/`.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
|
|
|
* monolog/monolog
|
|
|
|
* igorw/event-source
|
|
|
|
|
|
|
|
Required for published packages (libraries).
|
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### description
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
A short description of the package. Usually this is just one line long.
|
|
|
|
|
2012-04-14 21:52:52 +00:00
|
|
|
Required for published packages (libraries).
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### version
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2013-08-13 12:46:43 +00:00
|
|
|
The version of the package. In most cases this is not required and should
|
|
|
|
be omitted (see below).
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2013-08-13 12:46:43 +00:00
|
|
|
This must follow the format of `X.Y.Z` or `vX.Y.Z` with an optional suffix
|
2015-01-20 08:05:40 +00:00
|
|
|
of `-dev`, `-patch` (`-p`), `-alpha` (`-a`), `-beta` (`-b`) or `-RC`.
|
|
|
|
The patch, alpha, beta and RC suffixes can also be followed by a number.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
- 1.0.0
|
|
|
|
- 1.0.2
|
|
|
|
- 1.1.0
|
|
|
|
- 0.2.5
|
|
|
|
- 1.0.0-dev
|
|
|
|
- 1.0.0-alpha3
|
|
|
|
- 1.0.0-beta2
|
|
|
|
- 1.0.0-RC5
|
2015-01-20 08:05:40 +00:00
|
|
|
- v2.0.4-p1
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
Optional if the package repository can infer the version from somewhere, such
|
|
|
|
as the VCS tag name in the VCS repository. In that case it is also recommended
|
|
|
|
to omit it.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-06-14 12:59:11 +00:00
|
|
|
> **Note:** Packagist uses VCS repositories, so the statement above is very
|
|
|
|
> much true for Packagist as well. Specifying the version yourself will
|
|
|
|
> most likely end up creating problems at some point due to human error.
|
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### type
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
The type of the package. It defaults to `library`.
|
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
Package types are used for custom installation logic. If you have a package
|
|
|
|
that needs some special logic, you can define a custom type. This could be a
|
2012-02-26 11:40:35 +00:00
|
|
|
`symfony-bundle`, a `wordpress-plugin` or a `typo3-module`. These types will
|
|
|
|
all be specific to certain projects, and they will need to provide an
|
|
|
|
installer capable of installing packages of that type.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2015-06-22 09:08:23 +00:00
|
|
|
Out of the box, Composer supports four types:
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-03-24 17:20:27 +00:00
|
|
|
- **library:** This is the default. It will simply copy the files to `vendor`.
|
2013-04-11 10:35:41 +00:00
|
|
|
- **project:** This denotes a project rather than a library. For example
|
2013-04-11 09:53:19 +00:00
|
|
|
application shells like the [Symfony standard edition](https://github.com/symfony/symfony-standard),
|
|
|
|
CMSs like the [SilverStripe installer](https://github.com/silverstripe/silverstripe-installer)
|
|
|
|
or full fledged applications distributed as packages. This can for example
|
|
|
|
be used by IDEs to provide listings of projects to initialize when creating
|
|
|
|
a new workspace.
|
2012-03-24 17:20:27 +00:00
|
|
|
- **metapackage:** An empty package that contains requirements and will trigger
|
|
|
|
their installation, but contains no files and will not write anything to the
|
|
|
|
filesystem. As such, it does not require a dist or source key to be
|
|
|
|
installable.
|
2013-08-13 11:25:21 +00:00
|
|
|
- **composer-plugin:** A package of type `composer-plugin` may provide an
|
2012-04-08 17:13:00 +00:00
|
|
|
installer for other packages that have a custom type. Read more in the
|
|
|
|
[dedicated article](articles/custom-installers.md).
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
Only use a custom type if you need custom logic during installation. It is
|
|
|
|
recommended to omit this field and have it just default to `library`.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### keywords
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
An array of keywords that the package is related to. These can be used for
|
|
|
|
searching and filtering.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Examples:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
- logging
|
|
|
|
- events
|
|
|
|
- database
|
|
|
|
- redis
|
|
|
|
- templating
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### homepage
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
An URL to the website of the project.
|
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### time
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Release date of the version.
|
|
|
|
|
|
|
|
Must be in `YYYY-MM-DD` or `YYYY-MM-DD HH:MM:SS` format.
|
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### license
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
The license of the package. This can be either a string or an array of strings.
|
|
|
|
|
2012-05-07 19:34:25 +00:00
|
|
|
The recommended notation for the most common licenses is (alphabetical):
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
- Apache-2.0
|
|
|
|
- BSD-2-Clause
|
|
|
|
- BSD-3-Clause
|
|
|
|
- BSD-4-Clause
|
|
|
|
- GPL-2.0
|
|
|
|
- GPL-2.0+
|
|
|
|
- GPL-3.0
|
|
|
|
- GPL-3.0+
|
|
|
|
- LGPL-2.1
|
|
|
|
- LGPL-2.1+
|
|
|
|
- LGPL-3.0
|
|
|
|
- LGPL-3.0+
|
|
|
|
- MIT
|
2012-05-07 19:34:25 +00:00
|
|
|
|
|
|
|
Optional, but it is highly recommended to supply this. More identifiers are
|
2015-05-04 17:37:57 +00:00
|
|
|
listed at the [SPDX Open Source License Registry](https://www.spdx.org/licenses/).
|
2012-05-07 19:34:25 +00:00
|
|
|
|
2013-02-24 17:33:06 +00:00
|
|
|
For closed-source software, you may use `"proprietary"` as the license identifier.
|
|
|
|
|
2012-05-07 19:34:25 +00:00
|
|
|
An Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"license": "MIT"
|
|
|
|
}
|
|
|
|
```
|
2012-05-07 19:34:25 +00:00
|
|
|
|
2012-05-12 16:42:35 +00:00
|
|
|
For a package, when there is a choice between licenses ("disjunctive license"),
|
2012-05-07 19:34:25 +00:00
|
|
|
multiple can be specified as array.
|
|
|
|
|
|
|
|
An Example for disjunctive licenses:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"license": [
|
|
|
|
"LGPL-2.1",
|
|
|
|
"GPL-3.0+"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
```
|
2012-05-07 19:34:25 +00:00
|
|
|
|
2012-07-10 09:37:03 +00:00
|
|
|
Alternatively they can be separated with "or" and enclosed in parenthesis;
|
2012-05-07 19:34:25 +00:00
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"license": "(LGPL-2.1 or GPL-3.0+)"
|
|
|
|
}
|
|
|
|
```
|
2012-05-07 19:34:25 +00:00
|
|
|
|
2012-05-12 16:42:35 +00:00
|
|
|
Similarly when multiple licenses need to be applied ("conjunctive license"),
|
2012-07-10 09:37:03 +00:00
|
|
|
they should be separated with "and" and enclosed in parenthesis.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### authors
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
The authors of the package. This is an array of objects.
|
|
|
|
|
|
|
|
Each author object can have following properties:
|
|
|
|
|
|
|
|
* **name:** The author's name. Usually his real name.
|
|
|
|
* **email:** The author's email address.
|
|
|
|
* **homepage:** An URL to the author's website.
|
2012-05-01 14:01:55 +00:00
|
|
|
* **role:** The authors' role in the project (e.g. developer or translator)
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
An example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"authors": [
|
|
|
|
{
|
|
|
|
"name": "Nils Adermann",
|
|
|
|
"email": "naderman@naderman.de",
|
|
|
|
"homepage": "http://www.naderman.de",
|
|
|
|
"role": "Developer"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"name": "Jordi Boggiano",
|
|
|
|
"email": "j.boggiano@seld.be",
|
|
|
|
"homepage": "http://seld.be",
|
|
|
|
"role": "Developer"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
```
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Optional, but highly recommended.
|
|
|
|
|
2012-05-27 23:57:12 +00:00
|
|
|
### support
|
|
|
|
|
|
|
|
Various information to get support about the project.
|
|
|
|
|
|
|
|
Support information includes the following:
|
|
|
|
|
|
|
|
* **email:** Email address for support.
|
2015-05-28 11:03:24 +00:00
|
|
|
* **issues:** URL to the issue tracker.
|
|
|
|
* **forum:** URL to the forum.
|
|
|
|
* **wiki:** URL to the wiki.
|
2012-05-27 23:57:12 +00:00
|
|
|
* **irc:** IRC channel for support, as irc://server/channel.
|
|
|
|
* **source:** URL to browse or download the sources.
|
2015-05-28 11:03:24 +00:00
|
|
|
* **docs:** URL to the documentation.
|
2012-05-27 23:57:12 +00:00
|
|
|
|
|
|
|
An example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"support": {
|
|
|
|
"email": "support@example.org",
|
|
|
|
"irc": "irc://irc.freenode.org/composer"
|
2012-05-27 23:57:12 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-05-27 23:57:12 +00:00
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
2012-05-12 10:08:35 +00:00
|
|
|
### Package links
|
|
|
|
|
|
|
|
All of the following take an object which maps package names to
|
|
|
|
[version constraints](01-basic-usage.md#package-versions).
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"require": {
|
|
|
|
"monolog/monolog": "1.0.*"
|
2012-02-19 20:07:30 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-05-12 10:08:35 +00:00
|
|
|
All links are optional fields.
|
|
|
|
|
2015-06-22 08:00:04 +00:00
|
|
|
`require` and `require-dev` additionally support stability flags ([root-only](04-schema.md#root-package)).
|
2012-05-12 10:08:35 +00:00
|
|
|
These allow you to further restrict or expand the stability of a package beyond
|
|
|
|
the scope of the [minimum-stability](#minimum-stability) setting. You can apply
|
|
|
|
them to a constraint, or just apply them to an empty constraint if you want to
|
2013-08-23 09:09:46 +00:00
|
|
|
allow unstable packages of a dependency for example.
|
2012-05-12 10:08:35 +00:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"require": {
|
|
|
|
"monolog/monolog": "1.0.*@beta",
|
|
|
|
"acme/foo": "@dev"
|
2012-05-12 10:08:35 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-05-12 10:08:35 +00:00
|
|
|
|
2013-08-23 09:09:46 +00:00
|
|
|
If one of your dependencies has a dependency on an unstable package you need to
|
|
|
|
explicitly require it as well, along with its sufficient stability flag.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"require": {
|
|
|
|
"doctrine/doctrine-fixtures-bundle": "dev-master",
|
|
|
|
"doctrine/data-fixtures": "@dev"
|
2013-08-23 09:09:46 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2013-08-23 09:09:46 +00:00
|
|
|
|
2012-05-17 08:08:48 +00:00
|
|
|
`require` and `require-dev` additionally support explicit references (i.e.
|
2013-01-04 21:43:00 +00:00
|
|
|
commit) for dev versions to make sure they are locked to a given state, even
|
2012-05-17 08:08:48 +00:00
|
|
|
when you run update. These only work if you explicitly require a dev version
|
2013-11-11 13:41:21 +00:00
|
|
|
and append the reference with `#<ref>`.
|
2012-05-17 08:08:48 +00:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"require": {
|
|
|
|
"monolog/monolog": "dev-master#2eb0c0978d290a1c45346a1955188929cb4e5db7",
|
|
|
|
"acme/foo": "1.0.x-dev#abc123"
|
2012-05-17 08:08:48 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-05-17 08:08:48 +00:00
|
|
|
|
2013-11-11 13:41:21 +00:00
|
|
|
> **Note:** While this is convenient at times, it should not be how you use
|
|
|
|
> packages in the long term because it comes with a technical limitation. The
|
|
|
|
> composer.json metadata will still be read from the branch name you specify
|
|
|
|
> before the hash. Because of that in some cases it will not be a practical
|
|
|
|
> workaround, and you should always try to switch to tagged releases as soon
|
|
|
|
> as you can.
|
|
|
|
|
|
|
|
It is also possible to inline-alias a package constraint so that it matches
|
|
|
|
a constraint that it otherwise would not. For more information [see the
|
2012-11-07 12:11:09 +00:00
|
|
|
aliases article](articles/aliases.md).
|
|
|
|
|
2012-05-12 10:08:35 +00:00
|
|
|
#### require
|
|
|
|
|
|
|
|
Lists packages required by this package. The package will not be installed
|
|
|
|
unless those requirements can be met.
|
|
|
|
|
2015-06-22 08:00:04 +00:00
|
|
|
#### require-dev <span>([root-only](04-schema.md#root-package))</span>
|
2012-05-12 10:08:35 +00:00
|
|
|
|
|
|
|
Lists packages required for developing this package, or running
|
2013-08-07 19:11:52 +00:00
|
|
|
tests, etc. The dev requirements of the root package are installed by default.
|
|
|
|
Both `install` or `update` support the `--no-dev` option that prevents dev
|
|
|
|
dependencies from being installed.
|
2012-05-21 16:41:20 +00:00
|
|
|
|
2012-05-12 10:08:35 +00:00
|
|
|
#### conflict
|
|
|
|
|
|
|
|
Lists packages that conflict with this version of this package. They
|
|
|
|
will not be allowed to be installed together with your package.
|
|
|
|
|
2014-01-15 15:47:27 +00:00
|
|
|
Note that when specifying ranges like `<1.0 >=1.1` in a `conflict` link,
|
2013-06-20 21:32:59 +00:00
|
|
|
this will state a conflict with all versions that are less than 1.0 *and* equal
|
|
|
|
or newer than 1.1 at the same time, which is probably not what you want. You
|
2014-01-15 15:47:27 +00:00
|
|
|
probably want to go for `<1.0 | >=1.1` in this case.
|
2013-06-20 21:32:59 +00:00
|
|
|
|
2012-05-12 10:08:35 +00:00
|
|
|
#### replace
|
|
|
|
|
2012-05-12 16:27:28 +00:00
|
|
|
Lists packages that are replaced by this package. This allows you to fork a
|
|
|
|
package, publish it under a different name with its own version numbers, while
|
|
|
|
packages requiring the original package continue to work with your fork because
|
|
|
|
it replaces the original package.
|
2012-05-12 10:08:35 +00:00
|
|
|
|
2012-05-12 16:27:28 +00:00
|
|
|
This is also useful for packages that contain sub-packages, for example the main
|
2012-05-12 10:08:35 +00:00
|
|
|
symfony/symfony package contains all the Symfony Components which are also
|
|
|
|
available as individual packages. If you require the main package it will
|
|
|
|
automatically fulfill any requirement of one of the individual components,
|
|
|
|
since it replaces them.
|
|
|
|
|
2012-05-12 16:27:28 +00:00
|
|
|
Caution is advised when using replace for the sub-package purpose explained
|
|
|
|
above. You should then typically only replace using `self.version` as a version
|
2012-05-12 10:08:35 +00:00
|
|
|
constraint, to make sure the main package only replaces the sub-packages of
|
|
|
|
that exact version, and not any other version, which would be incorrect.
|
|
|
|
|
|
|
|
#### provide
|
|
|
|
|
|
|
|
List of other packages that are provided by this package. This is mostly
|
|
|
|
useful for common interfaces. A package could depend on some virtual
|
|
|
|
`logger` package, any library that implements this logger interface would
|
|
|
|
simply list it in `provide`.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2015-01-09 09:08:13 +00:00
|
|
|
#### suggest
|
2012-04-14 21:52:52 +00:00
|
|
|
|
|
|
|
Suggested packages that can enhance or work well with this package. These are
|
|
|
|
just informational and are displayed after the package is installed, to give
|
|
|
|
your users a hint that they could add more packages, even though they are not
|
|
|
|
strictly required.
|
|
|
|
|
|
|
|
The format is like package links above, except that the values are free text
|
|
|
|
and not version constraints.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"suggest": {
|
|
|
|
"monolog/monolog": "Allows more advanced logging of the application flow"
|
2012-04-14 21:52:52 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-04-14 21:52:52 +00:00
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### autoload
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Autoload mapping for a PHP autoloader.
|
|
|
|
|
2014-01-03 15:46:56 +00:00
|
|
|
Currently [`PSR-0`](http://www.php-fig.org/psr/psr-0/) autoloading,
|
|
|
|
[`PSR-4`](http://www.php-fig.org/psr/psr-4/) autoloading, `classmap` generation and
|
|
|
|
`files` includes are supported. PSR-4 is the recommended way though since it offers
|
|
|
|
greater ease of use (no need to regenerate the autoloader when you add classes).
|
|
|
|
|
|
|
|
#### PSR-4
|
|
|
|
|
|
|
|
Under the `psr-4` key you define a mapping from namespaces to paths, relative to the
|
|
|
|
package root. When autoloading a class like `Foo\\Bar\\Baz` a namespace prefix
|
|
|
|
`Foo\\` pointing to a directory `src/` means that the autoloader will look for a
|
|
|
|
file named `src/Bar/Baz.php` and include it if present. Note that as opposed to
|
|
|
|
the older PSR-0 style, the prefix (`Foo\\`) is **not** present in the file path.
|
|
|
|
|
|
|
|
Namespace prefixes must end in `\\` to avoid conflicts between similar prefixes.
|
|
|
|
For example `Foo` would match classes in the `FooBar` namespace so the trailing
|
|
|
|
backslashes solve the problem: `Foo\\` and `FooBar\\` are distinct.
|
|
|
|
|
|
|
|
The PSR-4 references are all combined, during install/update, into a single
|
|
|
|
key => value array which may be found in the generated file
|
|
|
|
`vendor/composer/autoload_psr4.php`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-4": {
|
|
|
|
"Monolog\\": "src/",
|
|
|
|
"Vendor\\Namespace\\": ""
|
2014-01-03 15:46:56 +00:00
|
|
|
}
|
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2014-01-03 15:46:56 +00:00
|
|
|
|
|
|
|
If you need to search for a same prefix in multiple directories,
|
|
|
|
you can specify them as an array as such:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-4": { "Monolog\\": ["src/", "lib/"] }
|
2014-01-03 15:46:56 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2014-01-03 15:46:56 +00:00
|
|
|
|
|
|
|
If you want to have a fallback directory where any namespace will be looked for,
|
|
|
|
you can use an empty prefix like:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-4": { "": "src/" }
|
2014-01-03 15:46:56 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-03-05 13:13:06 +00:00
|
|
|
|
2012-10-24 12:31:59 +00:00
|
|
|
#### PSR-0
|
|
|
|
|
2012-03-05 13:13:06 +00:00
|
|
|
Under the `psr-0` key you define a mapping from namespaces to paths, relative to the
|
2012-06-04 03:15:59 +00:00
|
|
|
package root. Note that this also supports the PEAR-style non-namespaced convention.
|
|
|
|
|
2013-05-13 12:58:11 +00:00
|
|
|
Please note namespace declarations should end in `\\` to make sure the autoloader
|
2013-05-13 13:03:42 +00:00
|
|
|
responds exactly. For example `Foo` would match in `FooBar` so the trailing
|
2013-05-13 12:58:11 +00:00
|
|
|
backslashes solve the problem: `Foo\\` and `FooBar\\` are distinct.
|
|
|
|
|
2012-06-07 10:25:05 +00:00
|
|
|
The PSR-0 references are all combined, during install/update, into a single key => value
|
2012-06-04 03:15:59 +00:00
|
|
|
array which may be found in the generated file `vendor/composer/autoload_namespaces.php`.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-0": {
|
|
|
|
"Monolog\\": "src/",
|
|
|
|
"Vendor\\Namespace\\": "src/",
|
|
|
|
"Vendor_Namespace_": "src/"
|
2012-02-29 14:56:53 +00:00
|
|
|
}
|
2012-02-19 20:07:30 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-04-27 08:01:01 +00:00
|
|
|
If you need to search for a same prefix in multiple directories,
|
2012-03-28 15:09:07 +00:00
|
|
|
you can specify them as an array as such:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-0": { "Monolog\\": ["src/", "lib/"] }
|
2012-03-28 15:09:07 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-06-07 10:25:05 +00:00
|
|
|
The PSR-0 style is not limited to namespace declarations only but may be
|
|
|
|
specified right down to the class level. This can be useful for libraries with
|
|
|
|
only one class in the global namespace. If the php source file is also located
|
2012-06-04 03:15:59 +00:00
|
|
|
in the root of the package, for example, it may be declared like this:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-0": { "UniqueGlobalClass": "" }
|
2012-06-04 03:15:59 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-06-04 03:15:59 +00:00
|
|
|
|
2012-04-27 08:01:01 +00:00
|
|
|
If you want to have a fallback directory where any namespace can be, you can
|
|
|
|
use an empty prefix like:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-0": { "": "src/" }
|
2012-04-27 08:01:01 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-04-27 08:01:01 +00:00
|
|
|
|
2012-10-24 12:31:59 +00:00
|
|
|
#### Classmap
|
|
|
|
|
2012-06-07 10:25:05 +00:00
|
|
|
The `classmap` references are all combined, during install/update, into a single
|
|
|
|
key => value array which may be found in the generated file
|
2012-12-08 20:54:51 +00:00
|
|
|
`vendor/composer/autoload_classmap.php`. This map is built by scanning for
|
|
|
|
classes in all `.php` and `.inc` files in the given directories/files.
|
2012-06-04 03:15:59 +00:00
|
|
|
|
2012-03-05 13:13:06 +00:00
|
|
|
You can use the classmap generation support to define autoloading for all libraries
|
2014-01-03 15:46:56 +00:00
|
|
|
that do not follow PSR-0/4. To configure this you specify all directories or files
|
2012-03-05 13:13:06 +00:00
|
|
|
to search for classes.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"classmap": ["src/", "lib/", "Something.php"]
|
2012-03-05 13:13:06 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-03-05 13:13:06 +00:00
|
|
|
|
2012-10-24 12:31:59 +00:00
|
|
|
#### Files
|
|
|
|
|
2012-06-02 16:18:33 +00:00
|
|
|
If you want to require certain files explicitly on every request then you can use
|
|
|
|
the 'files' autoloading mechanism. This is useful if your package includes PHP functions
|
|
|
|
that cannot be autoloaded by PHP.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"files": ["src/MyLibrary/functions.php"]
|
2012-06-02 16:18:33 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2012-06-02 16:18:33 +00:00
|
|
|
|
2015-10-30 00:00:44 +00:00
|
|
|
#### Exclude files from classmaps
|
2015-02-17 14:56:34 +00:00
|
|
|
|
|
|
|
If you want to exclude some files or folders from the classmap you can use the 'exclude-from-classmap' property.
|
2015-10-30 00:00:44 +00:00
|
|
|
This might be useful to exclude test classes in your live environment, for example.
|
|
|
|
|
|
|
|
The classmap generator will ignore all files in the paths configured here.
|
2015-02-17 14:56:34 +00:00
|
|
|
|
2015-10-30 00:00:44 +00:00
|
|
|
Example:
|
2015-02-17 14:56:34 +00:00
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"exclude-from-classmap": ["/Tests/", "/test/", "/tests/"]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-22 08:00:04 +00:00
|
|
|
### autoload-dev <span>([root-only](04-schema.md#root-package))</span>
|
2014-02-27 09:39:33 +00:00
|
|
|
|
2014-03-01 19:39:06 +00:00
|
|
|
This section allows to define autoload rules for development purposes.
|
2014-02-27 09:39:33 +00:00
|
|
|
|
2014-03-01 19:39:06 +00:00
|
|
|
Classes needed to run the test suite should not be included in the main autoload
|
|
|
|
rules to avoid polluting the autoloader in production and when other people use
|
|
|
|
your package as a dependency.
|
2014-02-27 09:39:33 +00:00
|
|
|
|
2014-03-01 19:39:06 +00:00
|
|
|
Therefore, it is a good idea to rely on a dedicated path for your unit tests
|
|
|
|
and to add it within the autoload-dev section.
|
2014-02-27 09:39:33 +00:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-4": { "MyLibrary\\": "src/" }
|
|
|
|
},
|
|
|
|
"autoload-dev": {
|
|
|
|
"psr-4": { "MyLibrary\\Tests\\": "tests/" }
|
2014-02-27 09:39:33 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
```
|
2014-02-27 09:39:33 +00:00
|
|
|
|
2012-04-08 15:42:57 +00:00
|
|
|
### include-path
|
|
|
|
|
2012-05-12 10:13:15 +00:00
|
|
|
> **DEPRECATED**: This is only present to support legacy projects, and all new code
|
|
|
|
> should preferably use autoloading. As such it is a deprecated practice, but the
|
|
|
|
> feature itself will not likely disappear from Composer.
|
2012-04-04 08:39:00 +00:00
|
|
|
|
|
|
|
A list of paths which should get appended to PHP's `include_path`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"include-path": ["lib/"]
|
|
|
|
}
|
|
|
|
```
|
2012-04-04 08:39:00 +00:00
|
|
|
|
2012-04-13 10:41:16 +00:00
|
|
|
Optional.
|
|
|
|
|
2012-03-18 10:49:06 +00:00
|
|
|
### target-dir
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2014-01-03 15:46:56 +00:00
|
|
|
> **DEPRECATED**: This is only present to support legacy PSR-0 style autoloading,
|
|
|
|
> and all new code should preferably use PSR-4 without target-dir and projects
|
|
|
|
> using PSR-0 with PHP namespaces are encouraged to migrate to PSR-4 instead.
|
|
|
|
|
2012-02-19 20:07:30 +00:00
|
|
|
Defines the installation target.
|
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
In case the package root is below the namespace declaration you cannot
|
|
|
|
autoload properly. `target-dir` solves this problem.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
An example is Symfony. There are individual packages for the components. The
|
|
|
|
Yaml component is under `Symfony\Component\Yaml`. The package root is that
|
|
|
|
`Yaml` directory. To make autoloading possible, we need to make sure that it
|
|
|
|
is not installed into `vendor/symfony/yaml`, but instead into
|
|
|
|
`vendor/symfony/yaml/Symfony/Component/Yaml`, so that the autoloader can load
|
|
|
|
it from `vendor/symfony/yaml`.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
To do that, `autoload` and `target-dir` are defined as follows:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"autoload": {
|
|
|
|
"psr-0": { "Symfony\\Component\\Yaml\\": "" }
|
|
|
|
},
|
|
|
|
"target-dir": "Symfony/Component/Yaml"
|
|
|
|
}
|
|
|
|
```
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
2015-06-22 08:00:04 +00:00
|
|
|
### minimum-stability <span>([root-only](04-schema.md#root-package))</span>
|
2012-05-12 10:08:35 +00:00
|
|
|
|
|
|
|
This defines the default behavior for filtering packages by stability. This
|
2012-07-04 14:37:28 +00:00
|
|
|
defaults to `stable`, so if you rely on a `dev` package, you should specify
|
|
|
|
it in your file to avoid surprises.
|
2012-05-12 10:08:35 +00:00
|
|
|
|
2012-07-04 14:37:28 +00:00
|
|
|
All versions of each package are checked for stability, and those that are less
|
2012-05-12 10:08:35 +00:00
|
|
|
stable than the `minimum-stability` setting will be ignored when resolving
|
|
|
|
your project dependencies. Specific changes to the stability requirements of
|
|
|
|
a given package can be done in `require` or `require-dev` (see
|
|
|
|
[package links](#package-links)).
|
|
|
|
|
2012-09-10 15:18:22 +00:00
|
|
|
Available options (in order of stability) are `dev`, `alpha`, `beta`, `RC`,
|
|
|
|
and `stable`.
|
2012-07-04 14:37:28 +00:00
|
|
|
|
2015-06-22 08:00:04 +00:00
|
|
|
### prefer-stable <span>([root-only](04-schema.md#root-package))</span>
|
2013-03-30 19:02:29 +00:00
|
|
|
|
|
|
|
When this is enabled, Composer will prefer more stable packages over unstable
|
|
|
|
ones when finding compatible stable packages is possible. If you require a
|
|
|
|
dev version or only alphas are available for a package, those will still be
|
2013-06-30 22:14:57 +00:00
|
|
|
selected granted that the minimum-stability allows for it.
|
|
|
|
|
|
|
|
Use `"prefer-stable": true` to enable.
|
2013-03-30 19:02:29 +00:00
|
|
|
|
2015-06-22 08:00:04 +00:00
|
|
|
### repositories <span>([root-only](04-schema.md#root-package))</span>
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Custom package repositories to use.
|
|
|
|
|
2015-06-22 09:08:23 +00:00
|
|
|
By default Composer just uses the packagist repository. By specifying
|
2012-02-20 10:08:18 +00:00
|
|
|
repositories you can get packages from elsewhere.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-02-20 10:08:18 +00:00
|
|
|
Repositories are not resolved recursively. You can only add them to your main
|
|
|
|
`composer.json`. Repository declarations of dependencies' `composer.json`s are
|
|
|
|
ignored.
|
2012-02-19 21:31:04 +00:00
|
|
|
|
2012-02-26 11:40:35 +00:00
|
|
|
The following repository types are supported:
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2015-06-22 09:08:23 +00:00
|
|
|
* **composer:** A Composer repository is simply a `packages.json` file served
|
2012-10-03 18:32:00 +00:00
|
|
|
via the network (HTTP, FTP, SSH), that contains a list of `composer.json`
|
|
|
|
objects with additional `dist` and/or `source` information. The `packages.json`
|
|
|
|
file is loaded using a PHP stream. You can set extra options on that stream
|
|
|
|
using the `options` parameter.
|
2012-02-20 10:08:18 +00:00
|
|
|
* **vcs:** The version control system repository can fetch packages from git,
|
2012-02-26 11:40:35 +00:00
|
|
|
svn and hg repositories.
|
2015-06-22 09:08:23 +00:00
|
|
|
* **pear:** With this you can import any pear repository into your Composer
|
2012-02-20 10:08:18 +00:00
|
|
|
project.
|
|
|
|
* **package:** If you depend on a project that does not have any support for
|
|
|
|
composer whatsoever you can define the package inline using a `package`
|
|
|
|
repository. You basically just inline the `composer.json` object.
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-03-07 23:18:03 +00:00
|
|
|
For more information on any of these, see [Repositories](05-repositories.md).
|
2012-02-19 20:07:30 +00:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
2014-05-19 10:17:07 +00:00
|
|
|
```json
|
|
|
|
{
|
|
|
|
"repositories": [
|
|
|
|
{
|
|
|
|
"type": "composer",
|
|
|
|
"url": "http://packages.example.com"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"type": "composer",
|
|
|
|
"url": "https://packages.example.com",
|
|
|
|
"options": {
|
|
|
|
"ssl": {
|
|
|
|
"verify_peer": "true"
|
2012-10-03 18:32:00 +00:00
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"type": "vcs",
|
|
|
|
"url": "https://github.com/Seldaek/monolog"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"type": "pear",
|
2015-05-04 17:37:57 +00:00
|
|
|
"url": "https://pear2.php.net"
|
2014-05-19 10:17:07 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
"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": {
|
2015-05-04 17:37:57 +00:00
|
|
|
"url": "https://smarty-php.googlecode.com/svn/",
|
2014-05-19 10:17:07 +00:00
|
|
|
"type": "svn",
|
|
|
|
"reference": "tags/Smarty_3_1_7/distribution/"
|
2012-02-19 20:07:30 +00:00
|
|
|
}
|
|
|
|
}
|
2014-05-19 10:17:07 +00:00
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
```
|
2012-02-19 20:07:30 +00:00
|
|
|
|
2012-03-15 00:13:10 +00:00
|
|
|
> **Note:** Order is significant here. When looking for a package, Composer
|
|
|
|
will look from the first to the last repository, and pick the first match.
|
|
|
|
By default Packagist is added last which means that custom repositories can
|
|
|
|
override packages from it.
|
2012-02-20 00:04:35 +00:00
|
|
|
|
2015-06-22 08:02:27 +00:00
|
|
|
### config <span>([root-only](04-schema.md#root-package))</span>
|
|
|
|
|
2015-10-30 00:00:44 +00:00
|
|
|
A set of configuration options. It is only used for projects. See
|
2015-06-22 08:02:27 +00:00
|
|
|
[Config](06-config.md) for a description of each individual option.
|
|
|
|
|
2015-06-22 08:53:04 +00:00
|
|
|
### scripts <span>([root-only](04-schema.md#root-package))</span>
|
|
|
|
|
|
|
|
Composer allows you to hook into various parts of the installation process
|
|
|
|
through the use of scripts.
|
|
|
|
|
|
|
|
See [Scripts](articles/scripts.md) for events details and examples.
|
|
|
|
|
|
|
|
### extra
|
|
|
|
|
|
|
|
Arbitrary extra data for consumption by `scripts`.
|
|
|
|
|
|
|
|
This can be virtually anything. To access it from within a script event
|
|
|
|
handler, you can do:
|
|
|
|
|
|
|
|
```php
|
|
|
|
$extra = $event->getComposer()->getPackage()->getExtra();
|
|
|
|
```
|
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
|
|
|
### bin
|
|
|
|
|
|
|
|
A set of files that should be treated as binaries and symlinked into the `bin-dir`
|
|
|
|
(from config).
|
|
|
|
|
|
|
|
See [Vendor Binaries](articles/vendor-binaries.md) for more details.
|
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
|
|
|
### archive
|
|
|
|
|
|
|
|
A set of options for creating package archives.
|
|
|
|
|
|
|
|
The following options are supported:
|
|
|
|
|
|
|
|
* **exclude:** Allows configuring a list of patterns for excluded paths. The
|
|
|
|
pattern syntax matches .gitignore files. A leading exclamation mark (!) will
|
|
|
|
result in any matching files to be included even if a previous pattern
|
|
|
|
excluded them. A leading slash will only match at the beginning of the project
|
|
|
|
relative path. An asterisk will not expand to a directory separator.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"archive": {
|
|
|
|
"exclude": ["/foo/bar", "baz", "/*.test", "!/foo/bar/baz"]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
The example will include `/dir/foo/bar/file`, `/foo/bar/baz`, `/file.php`,
|
|
|
|
`/foo/my.test` but it will exclude `/foo/bar/any`, `/foo/baz`, and `/my.test`.
|
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
|
|
|
### non-feature-branches
|
|
|
|
|
2015-10-30 00:00:44 +00:00
|
|
|
A list of regex patterns of branch names that are non-numeric (e.g. "latest" or something),
|
2015-06-22 09:08:23 +00:00
|
|
|
that will NOT be handled as feature branches. This is an array of strings.
|
2015-06-22 08:53:04 +00:00
|
|
|
|
|
|
|
If you have non-numeric branch names, for example like "latest", "current", "latest-stable"
|
2015-06-22 09:08:23 +00:00
|
|
|
or something, that do not look like a version number, then Composer handles such branches
|
2015-06-22 08:53:04 +00:00
|
|
|
as feature branches. This means it searches for parent branches, that look like a version
|
|
|
|
or ends at special branches (like master) and the root package version number becomes the
|
|
|
|
version of the parent branch or at least master or something.
|
|
|
|
|
|
|
|
To handle non-numeric named branches as versions instead of searching for a parent branch
|
|
|
|
with a valid version or special branch name like master, you can set patterns for branch
|
|
|
|
names, that should be handled as dev version branches.
|
|
|
|
|
|
|
|
This is really helpful when you have dependencies using "self.version", so that not dev-master,
|
|
|
|
but the same branch is installed (in the example: latest-testing).
|
|
|
|
|
|
|
|
An example:
|
|
|
|
|
|
|
|
If you have a testing branch, that is heavily maintained during a testing phase and is
|
|
|
|
deployed to your staging environment, normally "composer show -s" will give you `versions : * dev-master`.
|
|
|
|
|
|
|
|
If you configure `latest-.*` as a pattern for non-feature-branches like this:
|
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"non-feature-branches": ["latest-.*"]
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Then "composer show -s" will give you `versions : * dev-latest-testing`.
|
|
|
|
|
|
|
|
Optional.
|
|
|
|
|
2015-03-30 21:19:20 +00:00
|
|
|
← [Command-line interface](03-cli.md) | [Repositories](05-repositories.md) →
|