1
0
Fork 0
composer/doc/articles/vendor-bins.md

110 lines
3.1 KiB
Markdown
Raw Normal View History

2012-01-18 17:04:55 +00:00
# bin and vendor/bin
## What is a bin?
2012-01-22 21:06:38 +00:00
Any command line script that a Composer package would like to pass along
2012-01-18 17:04:55 +00:00
to a user who installs the package should be listed as a bin.
2012-01-22 21:06:38 +00:00
If a package contains other scripts that are not needed by the package
users (like build or compile scripts) that code should not be listed
2012-01-18 17:04:55 +00:00
as a bin.
## How is it defined?
It is defined by adding the `bin` key to a project's `composer.json`.
It is specified as an array of files so multiple bins can be added
for any given project.
2012-01-18 17:59:04 +00:00
```json
2012-01-18 17:04:55 +00:00
{
"bin": ["bin/my-script", "bin/my-other-script"]
}
2012-01-18 17:59:04 +00:00
```
2012-01-18 17:04:55 +00:00
## What does defining a bin in composer.json do?
It instructs Composer to install the package's bins to `vendor/bin`
for any project that **depends** on that project.
2012-01-22 21:06:38 +00:00
This is a convenient way to expose useful scripts that would
2012-01-18 17:04:55 +00:00
otherwise be hidden deep in the `vendor/` directory.
## What happens when Composer is run on a composer.json that defines bins?
For the bins that a package defines directly, nothing happens.
## What happens when Composer is run on a composer.json that has dependencies with bins listed?
Composer looks for the bins defined in all of the dependencies. A
symlink is created from each dependency's bins to `vendor/bin`.
Say package `my-vendor/project-a` has bins setup like this:
2012-01-18 17:59:04 +00:00
```json
2012-01-18 17:04:55 +00:00
{
"name": "my-vendor/project-a",
"bin": ["bin/project-a-bin"]
}
2012-01-18 17:59:04 +00:00
```
2012-01-18 17:04:55 +00:00
Running `composer install` for this `composer.json` will not do
anything with `bin/project-a-bin`.
Say project `my-vendor/project-b` has requirements setup like this:
2012-01-18 17:59:04 +00:00
```json
2012-01-18 17:04:55 +00:00
{
"name": "my-vendor/project-b",
"requires": {
"my-vendor/project-a": "*"
}
}
2012-01-18 17:59:04 +00:00
```
2012-01-18 17:04:55 +00:00
Running `composer install` for this `composer.json` will look at
all of project-b's dependencies and install them to `vendor/bin`.
2012-01-18 20:11:16 +00:00
In this case, Composer will make `vendor/my-vendor/project-a/bin/project-a-bin`
available as `vendor/bin/project-a-bin`. On a Unix-like platform
this is accomplished by creating a symlink.
2012-01-18 17:59:04 +00:00
## What about Windows and .bat files?
2012-01-18 20:11:16 +00:00
Packages managed entirely by Composer do not *need* to contain any
`.bat` files for Windows compatibility. Composer handles installation
of bins in a special way when run in a Windows environment:
* A `.bat` files is generated automatically to reference the bin
* A Unix-style proxy file with the same name as the bin is generated
automatically (useful for Cygwin or Git Bash)
Packages that need to support workflows that may not include Composer
are welcome to maintain custom `.bat` files. In this case, the package
should **not** list the `.bat` file as a bin as it is not needed.
2012-01-19 06:54:59 +00:00
## Can vendor bins be installed somewhere other than vendor/bin?
Yes, there are two ways that an alternate vendor bin location can be specified.
* Setting the `bin-dir` configuration setting in `composer.json`
* Setting the environment variable `COMPOSER_BIN_DIR`
2012-01-19 06:54:59 +00:00
An example of the former looks like this:
```json
{
"config": {
"bin-dir": "scripts"
2012-01-19 06:54:59 +00:00
}
}
```
Running `composer install` for this `composer.json` will result in
all of the vendor bins being installed in `scripts/` instead of
`vendor/bin/`.