## 安裝
安裝 Composer,你只需要下載?`composer.phar`?可執行文件。
~~~
curl -sS https://getcomposer.org/installer | php
~~~
詳細請查看?[簡介](http://docs.phpcomposer.com/00-intro.html)?章節。
要檢查 Composer 是否正常工作,只需要通過?`php`?來執行 PHAR:
~~~
php composer.phar
~~~
這將返回給你一個可執行的命令列表。
> **注意:**?你也可以僅執行?`--check`?選項而無需下載 Composer。 要獲取更多的信息請使用?`--help`。
>
> ~~~
> curl -sS https://getcomposer.org/installer | php -- --help
> ~~~
## `composer.json`:項目安裝
要開始在你的項目中使用 Composer,你只需要一個?`composer.json`?文件。該文件包含了項目的依賴和其它的一些元數據。
這個?[JSON format](http://json.org/)?是很容易編寫的。它允許你定義嵌套結構。
### 關于?`require`?Key
第一件事情(并且往往只需要做這一件事),你需要在?`composer.json`?文件中指定?`require`?key 的值。你只需要簡單的告訴 Composer 你的項目需要依賴哪些包。
~~~
{
"require": {
"monolog/monolog": "1.0.*"
}
}
~~~
你可以看到,?`require`?需要一個?**包名稱**?(例如?`monolog/monolog`) 映射到?**包版本**?(例如?`1.0.*`) 的對象。
### 包名稱
包名稱由供應商名稱和其項目名稱構成。通常容易產生相同的項目名稱,而供應商名稱的存在則很好的解決了命名沖突的問題。它允許兩個不同的人創建同樣名為?`json`?的庫,而之后它們將被命名為?`igorw/json`?和?`seldaek/json`。
這里我們需要引入?`monolog/monolog`,供應商名稱與項目的名稱相同,對于一個具有唯一名稱的項目,我們推薦這么做。它還允許以后在同一個命名空間添加更多的相關項目。如果你維護著一個庫,這將使你可以很容易的把它分離成更小的部分。
### 包版本
在前面的例子中,我們引入的 monolog 版本指定為?`1.0.*`。這表示任何從?`1.0`?開始的開發分支,它將會匹配`1.0.0`、`1.0.2`?或者?`1.0.20`。
版本約束可以用幾個不同的方法來指定。
| 名稱 | 實例 | 描述 |
| --- | --- | --- |
| 確切的版本號 | `1.0.2` | 你可以指定包的確切版本。 |
| 范圍 | `>=1.0`?`>=1.0,=1.0,=1.2` | 通過使用比較操作符可以指定有效的版本范圍。?有效的運算符:`>`、`>=`、`<`、`<=`、`!=`。?你可以定義多個范圍,用逗號隔開,這將被視為一個**邏輯AND**處理。一個管道符號`\|`將作為**邏輯OR**處理。?AND 的優先級高于 OR。|
| 通配符 | `1.0.*` | 你可以使用通配符`*`來指定一種模式。`1.0.*`與`>=1.0,<1.1`是等效的。 |
| 賦值運算符 | `~1.2` | 這對于遵循語義化版本號的項目非常有用。`~1.2`相當于`>=1.2,<2.0`。想要了解更多,請閱讀下一小節。 |
### 下一個重要版本(波浪號運算符)
`~`?最好用例子來解釋:?`~1.2`?相當于?`>=1.2,=1.2.3,<1.3`。正如你所看到的這對于遵循?[語義化版本號](http://semver.org/)?的項目最有用。一個常見的用法是標記你所依賴的最低版本,像?`~1.2`?(允許1.2以上的任何版本,但不包括2.0)。由于理論上直到2.0應該都沒有向后兼容性問題,所以效果很好。你還會看到它的另一種用法,使用?`~`?指定最低版本,但允許版本號的最后一位數字上升。
> **注意:**?雖然?`2.0-beta.1`?嚴格地說是早于?`2.0`,但是,根據版本約束條件, 例如?`~1.2`?卻不會安裝這個版本。就像前面所講的?`~1.2`?只意味著?`.2`?部分可以改變,但是?`1.`?部分是固定的。
### 穩定性
默認情況下只有穩定的發行版才會被考慮在內。如果你也想獲得 RC、beta、alpha 或 dev 版本,你可以使用?[穩定標志](http://docs.phpcomposer.com/04-schema.html#Package-links)。你可以對所有的包做?[最小穩定性](http://docs.phpcomposer.com/04-schema.html#minimum-stability)?設置,而不是每個依賴逐一設置。
## 安裝依賴包
獲取定義的依賴到你的本地項目,只需要調用?`composer.phar`?運行?`install`?命令。
~~~
php composer.phar install
~~~
接著前面的例子,這將會找到?`monolog/monolog`?的最新版本,并將它下載到?`vendor`?目錄。 這是一個慣例把第三方的代碼到一個指定的目錄?`vendor`。如果是 monolog 將會創建?`vendor/monolog/monolog`?目錄。
> **小技巧:**?如果你正在使用Git來管理你的項目, 你可能要添加?`vendor`?到你的?`.gitignore`?文件中。 你不會希望將所有的代碼都添加到你的版本庫中。
另一件事是?`install`?命令將創建一個?`composer.lock`?文件到你項目的根目錄中。
## `composer.lock`?- 鎖文件
在安裝依賴后,Composer 將把安裝時確切的版本號列表寫入?`composer.lock`?文件。這將鎖定改項目的特定版本。
**請提交你應用程序的?`composer.lock`?(包括?`composer.json`)到你的版本庫中**
這是非常重要的,因為?`install`?命令將會檢查鎖文件是否存在,如果存在,它將下載指定的版本(忽略?`composer.json`?文件中的定義)。
這意味著,任何人建立項目都將下載與指定版本完全相同的依賴。你的持續集成服務器、生產環境、你團隊中的其他開發人員、每件事、每個人都使用相同的依賴,從而減輕潛在的錯誤對部署的影響。即使你獨自開發項目,在六個月內重新安裝項目時,你也可以放心的繼續工作,即使從那時起你的依賴已經發布了許多新的版本。
如果不存在?`composer.lock`?文件,Composer 將讀取?`composer.json`?并創建鎖文件。
這意味著如果你的依賴更新了新的版本,你將不會獲得任何更新。此時要更新你的依賴版本請使用?`update`?命令。這將獲取最新匹配的版本(根據你的?`composer.json`?文件)并將新版本更新進鎖文件。
~~~
php composer.phar update
~~~
如果只想安裝或更新一個依賴,你可以白名單它們:
~~~
php composer.phar update monolog/monolog [...]
~~~
> **注意:**?對于庫,并不一定建議提交鎖文件 請參考:[庫的鎖文件](http://docs.phpcomposer.com/02-libraries.html#Lock-file).
## Packagist
[packagist](https://packagist.org/)?是 Composer 的主要資源庫。 一個 Composer 的庫基本上是一個包的源:記錄了可以得到包的地方。Packagist 的目標是成為大家使用庫資源的中央存儲平臺。這意味著你可以?`require`?那里的任何包。
當你訪問?[packagist website](https://packagist.org/)?(packagist.org),你可以瀏覽和搜索資源包。
任何支持 Composer 的開源項目應該發布自己的包在 packagist 上。雖然并不一定要發布在 packagist 上來使用 Composer,但它使我們的編程生活更加輕松。
## 自動加載
對于庫的自動加載信息,Composer 生成了一個?`vendor/autoload.php`?文件。你可以簡單的引入這個文件,你會得到一個免費的自動加載支持。
~~~
require 'vendor/autoload.php';
~~~
這使得你可以很容易的使用第三方代碼。例如:如果你的項目依賴 monolog,你就可以像這樣開始使用這個類庫,并且他們將被自動加載。
~~~
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');
~~~
你可以在?`composer.json`?的?`autoload`?字段中增加自己的 autoloader。
~~~
{
"autoload": {
"psr-4": {"Acme\\": "src/"}
}
}
~~~
Composer 將注冊一個?[PSR-4](http://www.php-fig.org/psr/psr-4/)?autoloader 到?`Acme`?命名空間。
你可以定義一個從命名空間到目錄的映射。此時?`src`?會在你項目的根目錄,與?`vendor`?文件夾同級。例如?`src/Foo.php`?文件應該包含?`Acme\Foo`?類。
添加?`autoload`?字段后,你應該再次運行?`install`?命令來生成?`vendor/autoload.php`?文件。
引用這個文件也將返回 autoloader 的實例,你可以將包含調用的返回值存儲在變量中,并添加更多的命名空間。這對于在一個測試套件中自動加載類文件是非常有用的,例如。
~~~
$loader = require 'vendor/autoload.php';
$loader->add('Acme\\Test\\', __DIR__);
~~~
除了 PSR-4 自動加載,classmap 也是支持的。這允許類被自動加載,即使不符合 PSR-0 規范。詳細請查看?[自動加載-參考](http://docs.phpcomposer.com/04-schema.html#autoload)。
> **注意:**?Composer 提供了自己的 autoloader。如果你不想使用它,你可以僅僅引入?`vendor/composer/autoload_*.php`?文件,它返回一個關聯數組,你可以通過這個關聯數組配置自己的 autoloader。