Composer 的結(jié)構(gòu)
Root Package(根目錄包)
根目錄包就是在你的項目的根目錄由 composer.json 定義的包般婆。主要就是由 composer.json 來定義你的項目的依賴惑申。
某些字段只能在根目錄包的中使用纱扭,比如 config 字段胰舆,只有根目錄包能定義自己的配置塞蹭。依賴包中的 config 字段是被忽略的棘捣。所以 config 字段是 root-only 的偶翅。
如果你克隆了其中一個依賴包并在上面工作默勾,那么這個包就是根目錄包。composer.json 還是一樣的聚谁,但上下文不同母剥。
(注:一個包是不是根目錄包,取決于上下文形导。)
composer.json 中的各個屬性(字段)
- name环疼。包的名字。由供應(yīng)方(vendor)名和項目名組成骤宣,用 / 分隔秦爆。==在發(fā)布包的時候需要填==。
- description 對包的一個簡短描述憔披,通常是一行的長度等限。==在發(fā)布包的時候需要填==。
- version 包的版本芬膝。格式必須是 X.Y.Z望门,選擇性后綴:-dev、-alphaN锰霜、-betaN筹误、-RCN。
- type包的類型癣缅,默認為 library厨剪。==包類型用于定制安裝邏輯==。如果你的包的安裝需要一些特殊的邏輯友存,你可以定義一個定制的類型祷膳。它可以是一個 symfony-bundle 的類型,或者 wordpress-plugin屡立,或者 typo3-module直晨。這些類型將被特定的項目所用,它們將提供安裝器來安裝這些類型的包。
Composer 支持 3 種類型:
- library:默認值勇皇。它將復(fù)制文件到 vendor 目錄罩句。
- project:它表示這是個項目,而不是庫敛摘。比如像 Symfony 標準版這種應(yīng)用门烂。
- metapackage:一個含有依賴的空包,能觸發(fā)安裝着撩,但不包含文件诅福,不會向文件系統(tǒng)寫任何東西。
- composer-install:為其他的定制類型的包提供安裝器的包拖叙。
- keywords 一個與包相關(guān)的關(guān)鍵詞數(shù)組氓润。用于包的搜索和過濾∈眵ⅲ可選咖气。
homepage
- 項目的網(wǎng)站 URL。
- 可選挖滤。
time
- 版本發(fā)布時間崩溪。
- 必須是 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS 格式。
- 可選斩松。
license
- 包的許可證伶唯。
- 可以是字符串或字符串數(shù)組。
- 可選惧盹,但強烈建議加上乳幸。
authors包的作者。是個對象數(shù)組钧椰。每個 author 對象有這些屬性:
name:作者名字
email:作者郵箱
homepage:作者網(wǎng)站 URL
role:作者在項目中的角色(如:developer 或 translator)
support各種關(guān)于該項目如何獲取支持的信息粹断。包含這些屬性:
email:獲取支持的郵箱
issues:問題跟蹤的 URL
forum:論壇的 URL
wiki:Wiki 的 URL
irc:IRC 的頻道
source:查看或下載源碼的 URL
可選。
Package links
依賴包的映射表嫡霞,由包名映射版本約束瓶埋。如:
{
"require": {
"monolog/monolog": "1.0.*"
}
}
require列出包所依賴的包。
除非這些依賴已經(jīng)存在诊沪,否則這個包不會被安裝养筒。
require-dev(root-only)列出開發(fā)這個包(或跑測試等等)所依賴的包。
在使用 install 命令時端姚,只有帶上 “–dev” 參數(shù)才能安裝 dev 包闽颇。在使用 update 命令時,帶上 “–no-dev” 則不更新寄锐。
conflict列出包會和哪些包發(fā)生沖突。
它們將不被允許和你的包一起安裝。如果約束了版本橄仆,則只會針對特定的版本剩膘。
replace列出哪些包要被這個包替代。
provide這個包所推薦的包列表盆顾。
這個對公共接口最有用怠褐,一個包可以依賴一個虛擬的 logger 包,而實現(xiàn) logger 接口的庫可以放到 provide 字段中您宪。
suggest建議一些能讓這個包工作的更好或得到增強的包列表奈懒。
這些信息只在包安裝完成時給出,暗示用戶可以添加更多包宪巨,雖然不是必須要安裝的磷杏。
格式是,包名映射文字說明捏卓,如:
{
"suggest": {
"monolog/monolog": "Allows more advanced logging of the application flow"
}
}
autoload
提供給 PHP autoloader 的自動加載映射极祸。
目前支持的有:PSR-0 自動加載規(guī)范,classmap 生成器怠晴,還有 files遥金。
PSR-0 是比較推薦的,因為它的優(yōu)秀的擴展性(在添加新的類的適合蒜田,不需要重新生成自動加載器)稿械。
PSR-0
在 psr-0 鍵名下,定義一個命名空間到路徑的映射表冲粤,相對于包的根目錄美莫。注意,這也同樣支持 PEAR-style 的沒有命名空間的風(fēng)格色解。
請注意命名空間的聲明得以 \ 結(jié)尾茂嗓,確保自動加載器正確響應(yīng)。
PSR-0 的引用可以在安裝或更新時生成的文件中查看:
vendor/composer/autoload_namespaces.php
例子:
{
"autoload": {
"psr-0": {
"Monolog\\": "src/",
"Vendor\\Namespace\\": "src/",
"Vendor_Namespace_": "src/"
}
}
}
如果你需要在多個目錄里查找同一個前綴的命名空間科阎,你可以用數(shù)組述吸,如:
{
"autoload": {
"psr-0": { "Monolog\\": ["src/", "lib/"] }
}
}
PSR-0 風(fēng)格并不局限于加載命名空間的聲明的東西,也可以用于類這個層級锣笨。當庫中只有一個在全局命名空間中的類時蝌矛,這種方式就能用上。比如你有個 PHP 源文件放在項目的根目錄错英,你可以這樣聲明:
{
"autoload": {
"psr-0": { "UniqueGlobalClass": "" }
}
}
如果你有個目錄下全是用命名空間組織的入撒,你可以用空前綴:
{
"autoload": {
"psr-0": { "": "src/" }
}
}
(2)Classmap
classmap 的引用可以在安裝或更新時生成的文件中查看:
vendor/composer/autoload_classmap.php
類映射表是通過掃描指定的目錄或文件下的所有的 .php 和 .inc 文件生成的。
你可以給任何不支持 PSR-0 的庫用 classmap 生成器實現(xiàn)自動加載椭岩。配置上只要指定類所在的目錄或文件即可:
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
(3)files
如果你確定需要在任何請求中都加載某些文件茅逮,你可以使用 files 自動加載機制璃赡。對于那些包中有些 PHP 函數(shù)但不能自動加載時特別有用。例如:
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}
include-path
(將被棄用献雅,它的功能由 autoload 代替碉考。其實就是設(shè)置 include_path,可選)
target-dir
指定安裝目標路徑挺身。
如果包的根目錄是在命名空間下侯谁,自動加載就不正確了,所以才有 target-dir 來解決這個問題章钾。
Symfony 就是個例子墙贱。它由很多組件包組成。Yaml 組件是在
Symfony\Component\Yaml
命名空間下的贱傀,它的根目錄是 Yaml 目錄惨撇。要讓自動加載正常工作,我們要確保它不是安裝在
vendor/symfony/yaml
窍箍,而是在
vendor/symfony/yaml/Symfony/Component/Yaml
串纺,這樣自動加載器才能從 vendor/symfony/yaml 加載它。
所以要定義 target-dir 如下:
{
"autoload": {
"psr-0": { "Symfony\\Component\\Yaml\\": "" }
},
"target-dir": "Symfony/Component/Yaml"
}
minimum-stability(root-only)
定義根據(jù)穩(wěn)定性如何過濾包椰棘。默認是 stable纺棺,如果你信賴一個 dev 包,你需要指明邪狞。
prefer-stable(root-only)
如果開啟祷蝌,Composer 會在穩(wěn)定包和不穩(wěn)定包中選擇前者。
repositories(root-only)
定制包的倉庫地址帆卓。
默認的巨朦,Composer 只使用 Packagist 倉庫。通過指定倉庫地址剑令,你可以從任何地方獲取包糊啡。
倉庫不能遞歸。你只能將它們添加到主的 composer.json 中吁津。所依賴包中 composer.json 文件中的倉庫定義是被忽略的棚蓄。
支持的倉庫的類型有:
- composer
composer 倉庫通過網(wǎng)絡(luò)提供 packages.json 文件,它包含一個 composer.json 對象的列表碍脏,還有額外的 dist 或 source 信息梭依。packages.json 文件通過 PHP 流加載。 - vcs
版本控制系統(tǒng)倉庫典尾,如:git役拴、svn、hg钾埂。 - pear
通過它河闰,你可以導(dǎo)入任何 pear 倉庫到你的項目中科平。 - package
如果你依賴一個不支持 composer 的項目,你可以定義一個 package 類型的倉庫姜性,然后將 composer.json 對象直接寫入匠抗。
完整的例子:
{
"repositories": [
{
"type": "composer",
"url": "http://packages.example.com"
},
{
"type": "composer",
"url": "https://packages.example.com",
"options": {
"ssl": {
"verify_peer": "true"
}
}
},
{
"type": "vcs",
"url": "https://github.com/Seldaek/monolog"
},
{
"type": "pear",
"url": "http://pear2.php.net"
},
{
"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": "tags/Smarty_3_1_7/distribution/"
}
}
}
]
}
config(root-only)
針對項目的一些配置:
process-timeout:默認 300 秒,Composer 進程執(zhí)行超時時間污抬;
use-include-path:默認 false,如果是 true绳军,Composer 自動加載器也會到 PHP 的 include_path 中查找印机;
preferred-install:默認 auto,設(shè)置 Composer 安裝方式门驾;
github-protocols:默認 [“git”, “https”]射赛,設(shè)置與 github 通信協(xié)議;
github-oauth:設(shè)置 oauth奶是;
vendor-dir:默認 vendor楣责,你可以換成別的;
bin-dir:默認 vendor/bin聂沙,如果項目有二進制文件秆麸,會鏈接到這;
cache-dir:默認 $home/cache及汉,存放 Composer 運行時產(chǎn)生的緩存沮趣;
cache-files-dir:默認 $cache-dir/files,存放包的 zip 文件坷随;
cache-repo-dir:默認 $cache-dir/repo房铭,存放倉庫元數(shù)據(jù);
cache-vcs-dir:默認 $cache-dir/vcs温眉,存放 vcs 克赂追恕;
cache-files-ttl:默認六個月类溢,緩存的過期時間凌蔬;
cache-files-maxsize:默認 300M;
notify-no-install:默認 true豌骏,從倉庫安裝包會有個通知龟梦,可以關(guān)掉;
discard-changes:默認false窃躲,如何處理臟的更新计贰;
- scripts(root-only)Composer 允許你在安裝進程中安裝鉤子腳本,鉤子是基于事件的蒂窒;
- extra供 scripts 消費的額外數(shù)據(jù)躁倒;
- bin指定哪些文件必須被當做二進制文件處理的荞怒;
- archive
設(shè)置創(chuàng)建包時的選項,exclude 屬性可以設(shè)置排除哪些目錄秧秉,例如:
{
"archive": {
"exclude": ["/foo/bar", "baz", "/*.test", "!/foo/bar/baz"]
}
}
這篇看下來褐桌,再看 Symfony 的標準版中的 composer.json,應(yīng)該了然了吧象迎。