本章將告訴你如何通過 Composer 來安裝你的庫。
## 每一個項目都是一個包
只要你有一個?`composer.json`?文件在目錄中,那么整個目錄就是一個包。當你添加一個?`require`?到項目中,你就是在創建一個依賴于其它庫的包。你的項目和庫之間唯一的區別是,你的項目是一個沒有名字的包。
為了使它成為一個可安裝的包,你需要給它一個名稱。你可以通過?`composer.json`?中的?`name`?來定義:
~~~
{
"name": "acme/hello-world",
"require": {
"monolog/monolog": "1.0.*"
}
}
~~~
在這種情況下項目的名稱為?`acme/hello-world`,其中?`acme`?是供應商的名稱。供應商的名稱是必須填寫的。
> **注意:**?如果你不知道拿什么作為供應商的名稱, 那么使用你 github 上的用戶名通常是不錯的選擇。 雖然包名不區分大小寫,但慣例是使用小寫字母,并用連字符作為單詞的分隔。
## 平臺軟件包
Composer 將那些已經安裝在系統上,但并不是由 Composer 安裝的包視為一個虛擬的平臺軟件包。這包括PHP本身,PHP擴展和一些系統庫。
* `php`?表示用戶的 PHP 版本要求,你可以對其做出限制。例如?`>=5.4.0`。如果需要64位版本的 PHP,你可以使用?`php-64bit`?進行限制。
* `hhvm`?代表的是 HHVM(也就是 HipHop Virtual Machine) 運行環境的版本,并且允許你設置一個版本限制,例如,'>=2.3.3'。
* `ext-`?可以幫你指定需要的 PHP 擴展(包括核心擴展)。通常 PHP 拓展的版本可以是不一致的,將它們的版本約束為?`*`?是一個不錯的主意。一個 PHP 擴展包的例子:包名可以寫成?`ext-gd`。
* `lib-`?允許對 PHP 庫的版本進行限制。
以下是可供使用的名稱:`curl`、`iconv`、`icu`、`libxml`、`openssl`、`pcre`、`uuid`、`xsl`。
你可以使用?`composer show --platform`?命令來獲取可用的平臺軟件包的列表。
## 指明版本
你需要一些方法來指明自己開發的包的版本,當你在 Packagist 上發布自己的包,它能夠從 VCS (git, svn, hg) 的信息推斷出包的版本,因此你不必手動指明版本號,并且也不建議這樣做。請查看?[標簽](http://docs.phpcomposer.com/02-libraries.html#Tags)?和?[分支](http://docs.phpcomposer.com/02-libraries.html#Branches)?來了解版本號是如何被提取的。
如果你想要手動創建并且真的要明確指定它,你只需要添加一個?`version`?字段:
~~~
{
"version": "1.0.0"
}
~~~
> **注意:**?你應該盡量避免手動設置版本號,因為標簽的值必須與標簽名相匹配。
### 標簽
對于每一個看起來像版本號的標簽,都會相應的創建一個包的版本。它應該符合 'X.Y.Z' 或者 'vX.Y.Z' 的形式,`-patch`、`-alpha`、`-beta`?或?`-RC`?這些后綴是可選的。在后綴之后也可以再跟上一個數字。
下面是有效的標簽名稱的幾個例子:
* 1.0.0
* v1.0.0
* 1.10.5-RC1
* v4.4.4beta2
* v2.0.0-alpha
* v2.0.4-p1
> **注意:**?即使你的標簽帶有前綴?`v`, 由于在需要?`require`?一個[版本的約束](http://docs.phpcomposer.com/01-basic-usage.html#Package-Versions)時是不允許這種前綴的, 因此?`v`?將被省略(例如標簽?`V1.0.0`?將創建?`1.0.0`?版本)。
### 分支
對于每一個分支,都會相應的創建一個包的開發版本。如果分支名看起來像一個版本號,那么將創建一個如同?`{分支名}-dev`?的包版本號。例如一個分支?`2.0`?將產生一個?`2.0.x-dev`?包版本(加入了?`.x`?是出于技術的原因,以確保它被識別為一個分支,而?`2.0.x`?的分支名稱也是允許的,它同樣會被轉換為?`2.0.x-dev`)。如果分支名看起來不像一個版本號,它將會創建?`dev-{分支名}`?形式的版本號。例如?`master`?將產生一個?`dev-master`?的版本號。
下面是版本分支名稱的一些示例:
* 1.x
* 1.0 (equals 1.0.x)
* 1.1.x
> **注意:**?當你安裝一個新的版本時,將會自動從它?`source`?中拉取。 詳細請查看?[`install`](http://docs.phpcomposer.com/03-cli.html#install)?命令。
### 別名
它表示一個包版本的別名。例如,你可以為?`dev-master`?設置別名?`1.0.x-dev`,這樣就可以通過 require?`1.0.x-dev`?來得到?`dev-master`?版本的包。
詳細請查看[“別名”](http://docs.phpcomposer.com/articles/aliases.html)。
## 鎖文件
如果你愿意,可以在你的項目中提交?`composer.lock`?文件。他將幫助你的團隊始終針對同一個依賴版本進行測試。任何時候,這個鎖文件都只對于你的項目產生影響。
如果你不想提交鎖文件,并且你正在使用 Git,那么請將它添加到?`.gitignore`?文件中。
## 發布到 VCS(線上版本控制系統)
一旦你有一個包含?`composer.json`?文件的庫存儲在線上版本控制系統(例如:Git),你的庫就可以被 Composer 所安裝。在這個例子中,我們將?`acme/hello-world`?庫發布在 GitHub 上的?`github.com/username/hello-world`?中。
現在測試這個?`acme/hello-world`?包,我們在本地創建一個新的項目。我們將它命名為?`acme/blog`。此博客將依賴?`acme/hello-world`,而后者又依賴?`monolog/monolog`。我們可以在某處創建一個新的?`blog`?文件夾來完成它,并且需要包含?`composer.json`?文件:
~~~
{
"name": "acme/blog",
"require": {
"acme/hello-world": "dev-master"
}
}
~~~
在這個例子中?`name`?不是必須的,因為我們并不想將它發布為一個庫。在這里為?`composer.json`?文件添加描述。
現在我們需要告訴我們的應用,在哪里可以找到?`hello-world`?的依賴。為此我們需要在?`composer.json`?中添加?`repositories`?來源申明:
~~~
{
"name": "acme/blog",
"repositories": [
{
"type": "vcs",
"url": "https://github.com/username/hello-world"
}
],
"require": {
"acme/hello-world": "dev-master"
}
}
~~~
更多關于包的來源是如何工作的,以及還有什么其他的類型可供選擇,請查看[資源庫](http://docs.phpcomposer.com/05-repositories.html)。
這就是全部了。你現在可以使用 Composer 的?`install`?命令來安裝你的依賴包了!
**小結:**?任何含有?`composer.json`?的?`GIT`、`SVN`、`HG`?存儲庫,都可以通過?`require`?字段指定“包來源”和“聲明依賴”來添加到你的項目中。
## 發布到 packagist
好的,你現在可以發布你的包了,但你不會希望你的用戶每次都這樣繁瑣的指定包的來源。
你可能注意到了另一件事,我們并沒有指定?`monolog/monolog`?的來源。它是怎么工作的?答案是 packagist。
[Packagist](https://packagist.org/)?是 Composer 主要的一個包信息存儲庫,它默認是啟用的。任何在 packagist 上發布的包都可以直接被 Composer 使用。就像 monolog 它被?[發布在 packagist 上](https://packagist.org/packages/monolog/monolog),我們可以直接使用它,而不必指定任何額外的來源信息。
如果我們想與世界分享我們的?`hello-world`,我們最好將它發布到 packagist 上。這樣做是很容易的。
你只需要點擊那個大大的 "Submit Package" 按鈕并注冊。接著提交你庫的來源地址,此時 packagist 就開始了抓取。一旦完成,你的包將可以提供給任何人使用。