是什么
如果你知道yum
、apt-get
、npm
、bower
等命令中的一種或者多種,那么,你也能很快知道composer
是什么了。沒錯,它就是PHP里快速安裝類庫的。平時,我們安裝一個PHP類庫,需要搜索->下載
;使用composer
,我們只要知道包名,直接composer insatll
就可以了。
PHP 語言本身就帶有強大的網絡功能、文件管理功能和豐富的系統 API,Composer 也只是一段 PHP 腳本而已。
引自Composer中文網的描述:
是 PHP 用來管理依賴(dependency)關系的工具。你可以在自己的項目中聲明所依賴的外部工具庫(libraries),Composer 會幫你安裝這些依賴的庫文件。
作用
安裝PHP包、依賴庫。
示例:
$ composer require monolog/monolog
這是在安裝monolog
庫。
$ composer create-project laravel/laravel learnlaravel5 5.0.22
這是在安裝laravel
框架並創建項目。
YII
框架也是通過composer
安裝的。
為什么用composer
通過過composer
,我們可以使用大量的第三方庫,而無需自己造輪子。優秀項目示例:
- overtrue/wechat 讓微信開發更簡單!
- catfan/medoo 一款ORM框架
- monolog/monolog 日志記錄
- hprose/hprose RPC框架
你可以在 https://packagist.org/ 找到你需要的庫。甚至你可以提交自己寫的優秀的庫到該平台里供大家使用。
如果不會composer
,流行的laravel
、yii
框架安裝都成為問題,更不用談學習了;很多優秀的輪子你無法使用。所以,推薦phper必須學會composer。
安裝Composer
先下載composer.phar:
wget https://mirrors.aliyun.com/composer/composer.phar
其它下載源詳見后文"Composer鏡像加速"。
各系統按照下面的操作執行安裝:
Linux/Mac:
mv composer.phar /usr/local/bin/composer
chmod +x /usr/local/bin/composer
Windows:
下載后放到php安裝位置里,然后新建文件:
composer.bat #windows用
composer #git-bash用
composer.bat
@ECHO OFF
php "%~dp0composer.phar" %*
composer
#!/bin/sh
dir=$(d=$(dirname "$0"); cd "$d" && pwd)
# see if we are running in cygwin by checking for cygpath program
if command -v 'cygpath' >/dev/null 2>&1; then
# cygwin paths start with /cygdrive/ which will break windows PHP,
# so we need to translate the dir path to windows format. However
# we could be using cygwin PHP which does not require this, so we
# test if the path to PHP starts with /cygdrive/ rather than /usr/bin.
if [[ $(which php) == /cygdrive/* ]]; then
dir=$(cygpath -m $dir);
fi
fi
dir=$(echo $dir | sed 's/ /\ /g')
php "${dir}/composer.phar" $*
如果上述鏈接下載不了,請使用: http://pan.baidu.com/s/1gfmSIbD 密碼: f4vr 。
我還專門建了github倉庫:https://github.com/52fhy/composer。
Linux需要給composer可執行權限。之后就可以使用composer了:
$ composer -V
Composer version 1.9-dev (1.9-dev+e022c073706769d0486de96de0f98719cd9950b5) 2019-06-27 12:06:49
生成一個空的Composer項目
在合適的地方新建一個文件夾,命名為 MFFC(My First Framework based on Composer),在文件夾下新建文件 composer.json
:
{
"require": {
}
}
命令行切換到 MFFC 目錄下,運行:
composer update
就會在該目錄下生成一個vendor
文件夾。以后所有的第三擴展包都會安裝在這里。
里面的代碼大家可以看看。
安裝擴展包
以下以monolog
為例:
聲明依賴
在項目目錄下創建一個composer.json
文件,指明依賴,比如,你的項目依賴 monolog:
{
"require": {
"monolog/monolog": "1.2.*"
}
}
如果不需要使用https
,可以這么寫,以解決有時候因為https造成的問題:
{
"require": {
"monolog/monolog": "1.2.*"
},
"config": {
"secure-http": false
}
}
安裝依賴
安裝依賴非常簡單,只需在項目目錄下運行:
composer install
如果沒有全局安裝的話,則運行:
php composer.phar install
更新全部的包(謹慎使用):
composer update
注意:使用composer install
或者composer update
命令將會更新所有的擴展包,項目中使用需謹慎!!!
若只安裝指定的包推薦在命令行使用:
composer require monolog/monolog
進行安裝。
如果需要指定版本:
composer require "monolog/monolog:1.2.*"
更新某個包:
composer update monolog/monolog
移除某個包:
composer remove monolog/monolog
如果手動更新了composer.json需要更新autoload:
composer dump-autoload
包版本約束
精確版本:示例: 1.0.2
。
范圍:使用比較操作符你可以指定包的范圍。這些操作符包括:>,>=,<,<=,!=。你可以定義多個范圍,使用空格 或者逗號,表示邏輯上的與,使用雙豎線||表示邏輯上的或。其中與的優先級會大於或。示例:
>=1.0
>=1.0 <2.0
>=1.0 <1.1 || >=1.2
范圍(使用連字符):
例子:1.0 - 2.0
,等同於>=1.0.0 <2.1
(2.0相當於2.0.*)。
通配符:可以使用通配符去定義版本。1.0.*
相當於>=1.0 <1.1
。
例子:1.0.*
下一個重要版本操作符:使用波浪號~
。示例:
~1.2
相當於>=1.2 <2.0.0
,而~1.2.3
相當於>=1.2.3 <1.3.0
。
折音號^
:例如,^1.2.3
相當於>=1.2.3 <2.0.0
,因為在2.0版本前的版本應該都沒有兼容性的問題。而對於1.0之前的版本,這種約束方式也考慮到了安全問題,例如^0.3
會被當作>=0.3.0 <0.4.0
對待。
自動加載
Composer提供了自動加載的特性,只需在你的代碼的初始化部分中加入下面一行:
require 'vendor/autoload.php';
詳細示例
{
"require": {
"php": ">=5.4.0",
"illuminate/database": "*",
"monolog/monolog": "1.2.*"
},
"config": {
"secure-http": false
},
"autoload": {
"classmap": [
"app/models"
],
"files": [
"vendor/yjc/src/Alipay/autoload.php"
],
"psr-4": {
"Yjc\\Sms\\": "vendor/yjc/src/Sms"
}
}
}
autoload
部分指定自動加載的文件夾,每次里面的文件有新增,使用composer dump-autoload
即可。
詳見:http://docs.phpcomposer.com/03-cli.html#dump-autoload
命令匯總
composer list 列出所有可用的命令
composer init 初始化composer.json文件(就不勞我們自己費力創建啦),會要求輸入一些信息來描述我們當前的項目,還會要求輸入依賴包
composer install 讀取composer.json內容,解析依賴關系,安裝依賴包到vendor目錄下
composer update 更新最新的依賴關系到compsoer.lock文件,解析最新的依賴關系並且寫入composer.lock文件
composer search packagename 搜索包,packagename替換為你想查找的包名稱
composer require packagename 添加對packagename的依賴,packagename可修改為你想要的包名稱
composer show packagename
composer self-update 更新 composer.phar文件自身
composer dump-autoload --optimize 優化一下自動加載
composer command --help 以上所有命令都可以添加 --help選項查看幫助信息
更多可用命令,可以在命令行輸入composer
進行查看。
模塊倉庫
packagist.org是Composer的倉庫,很多著名的PHP庫都能在其中找到。你也可以提交你自己的作品。
當你安裝完Composer后,使用時,卻發現不能下載包,或者很慢,這是一個『眾所周知』的原因。
所以,我們使用國內的鏡像站點進行代替,常用方法有兩種:
1、修改全局配置:全局配置的文件一般放在C:\Users\XXX\AppData\Roaming\Composer\config.json
,例如C:\Users\YJC\AppData\Roaming\Composer\config.json
。
(這里以windows路徑為例)。可以通過命令composer config -l
查看配置,其中[home]
為配置所在目錄。config.json
即為配置文件。
{
"config": {
},
"repositories": [
{"type": "composer", "url": "http://pkg.phpcomposer.com/repo/packagist/"},
{"packagist": false}
]
}
或者命令行直接修改:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
2、修改當前配置:即項目當前的composer.json文件;
{
"require": {
"noahbuscher/macaw": "dev-master"
},
"repositories": [
{
"packagist": false
},
{
"type": "composer",
"url": "http://packagist.cn"
}
]
}
3、常見鏡像地址:
https://packagist.org 國外的
http://packagist.phpcomposer.com 中國全量鏡像
推薦的包
overtrue/wechat 讓微信開發更簡單!
thenbsp/wechat
catfan/medoo
illuminate/database
psr/log
monolog/monolog
symfony/event-dispatcher
phpunit/phpunit
phpunit/php-timer
michelf/php-markdown markdown 文檔解析
intervention/image 圖片處理
mytharcher/alipay-php-sdk
更多查看:https://packagist.org/explore/popular
發布自己的包
大概步驟如下:
在github上創建一個項目(項目名稱可以隨意)
編寫composer.json
copy代碼文件並修改命名空間
在https://packagist.org/上遞交自己的包
設置github的hook
編寫composer.json
先看一個示例:
{
"name": "jenner/message_queue",
"description": "php message queue wrapper",
"license": "MIT",
"keywords": ["message queue"],
"version": "1.0.0",
"authors": [
{
"name": "Jenner",
"email": "hypxm@qq.com"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-0": {
"Jenner\\Zebra\\MessageQueue": "src/"
}
}
}
需要注意的幾個字段說明如下:
name:包名稱,遞交時packagist會檢測報名字是否合法。必須是一個/分隔的字符串。當別人引入你的包時,vendor下會自動創建這個目錄。例如org/package
包,則會在vender下創建org/package目錄。
autoload:包的加載方式,具體加載方式可以參考composer中文網說明。這里使用的是psr-0標准加載方式。composer會在src目錄下根據命名空間執行自動加載。
PSR規范
Framework Interoperability Group(框架可互用性小組),簡稱 FIG,成立於 2009 年。FIG 最初由幾位知名 PHP 框架開發者發起,在吸納了許多優秀的大腦和強健的體魄后,提出了 PSR-0 到 PSR-4 五套 PHP 非官方規范:
- PSR-0 (Autoloading Standard) 自動加載標准
- PSR-1 (Basic Coding Standard) 基礎編碼標准
- PSR-2 (Coding Style Guide) 編碼風格向導
- PSR-3 (Logger Interface) 日志接口
- PSR-4 (Improved Autoloading) 自動加載優化標准
之后,在此標准之上,Composer 橫空出世!Composer 利用 PSR-0 和 PSR-4 以及 PHP5.3 的命名空間構造了一個繁榮的 PHP 生態系統。Composer 類似著名的 npm 和 RubyGems,給海量 PHP 包提供了一個異常方便的協作通道,Composer Hub 地址:https://packagist.org/。Composer 中文網站:http://www.phpcomposer.com/。
目前 PHP 界風頭正勁的 Laravel 和 Symfony 均直接基於 Composer,大家耳熟能詳著名框架 CI 和 Yii 的正開發版本 CodeIgniter 3 和 Yii 2 也都基於 Composer(更新:北京時間2014年10月13日 Yii 2 已經發布)。Composer 就是 PHP 框架的未來,有了它,讓 CI 的路由和 Laravel 的 Eloquent ORM 協作就會變的非常簡單。
常見問題
1、Windows下出現:Fxp\Composer\AssetPlugin\Repository\NpmRepository does not exist
進入C:\Users\YJC\AppData\Roaming\Composer目錄,刪除vendor目錄。
Composer鏡像加速
設置鏡像
請盡可能用比較新的 Composer 版本。
使用 Composer
鏡像加速有兩種選項:
- 選項一:全局配置,這樣所有項目都能惠及(推薦);
- 選項二:單獨項目配置;
選項一、全局配置(推薦)
$ composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
選項二、單獨使用
如果僅限當前工程使用鏡像,去掉 -g
即可,如下:
$ composer config repo.packagist composer https://mirrors.aliyun.com/composer/
解除鏡像
如果需要解除鏡像並恢復到 packagist 官方源,請執行以下命令:
composer config -g --unset repos.packagist
執行之后,composer 會利用默認值(也就是官方源)重置源地址。
鏡像源列表
- 阿里雲:https://mirrors.aliyun.com/composer/
- 騰訊雲: https://mirrors.cloud.tencent.com/composer/
- 安暢網絡鏡像:https://php.cnpkg.org
- 交通大學鏡像(非全量):https://packagist.mirrors.sjtug.sjtu.edu.cn/
- 中國全量鏡像站: https://install.phpcomposer.com/
- Packagist中國全量鏡像: https://pkg.phpcomposer.com/#how-to-install-composer
參考
1、利用 Composer 一步一步構建自己的 PHP 框架(一)——基礎准備 - 歲寒
https://lvwenhan.com/php/405.html
2、PHP 開發者該知道的 5 個 Composer 小技巧 - 新聞 - SegmentFault
https://segmentfault.com/a/1190000000355928
3、Composer 中文網
http://www.phpcomposer.com/
4、Packagist / Composer 中國全量鏡像
http://pkg.phpcomposer.com/
5、Composer安裝
https://getcomposer.org/download/
6、composer之創建自己的包 - 始終不夠
http://www.huyanping.cn/composer之創建自己的包/
7、php - 請各位分享或推薦一下composer里面好用的包 - SegmentFault
https://segmentfault.com/q/1010000000484379
8、給 CI 插上翅膀——在 CodeIgniter 2 中使用 Laravel Eloquent ORM - 歲寒
https://lvwenhan.com/php/414.html
9、Composer進階使用 —— 常用命令和版本約束 - icyfire - SegmentFault
https://segmentfault.com/a/1190000005898222
10、Composer 國內加速:可用鏡像列表 | Composer 技術論壇
https://learnku.com/composer/wikis/30594