一、composer入门
1、每次安装新的包文件,会更新/vendor/autoload.php文件
2、composer.lock与composer.json的关系
文件composer.lock会根据composer.json的内容自动生成,和composer.json在同一位置,即在安装完所有需要的包之后,Composer会在composer.lock文件中生成一张标准的包版本的文件,这将锁定所有包的版本。可以使用composer.lock (当然是和composer.json一起)来控制项目的版本。
composer.lock与composer.json的关系为,composer.json文件为包的元信息,composer.lock文件同样为包的元信息,但在composer.json文件中可以指定使用不明确的依赖包版本,如“>=1.0”,在composer.lock文件中的会是当前安装的版本。那么当使用Composer安装包时,它会优先从composer.lock文件读取依赖版本,再根据composer.json文件去获取依赖。这确保了该库的每个使用者都能得到相同的依赖版本。这对于团队开发来讲非常重要。
二、composer常用命令
1、composer install
当项目重新部署或者合并分支时,都需要执行
composer install
命令。如果当前项目根目录存在composer.lock文件,则会首先根据composer.lock文件指定的包版本从composer中下载相应的包,如果没有,则根据composer.json文件到composer中下载合适版本的包,并生成composer.lock文件。2、composer update
如果直接执行
composer update
命令,后面不指定包名,则会更新项目依赖的所有包文件,因此当项目已经成型,composer update
命令要慎用,不能随便执行,特别是生产环境!当然,我们可以在
composer update
命令后面跟上包名称,这样子就只会更新指定的包,具体步骤是:先修改composer.json文件中,对应包(比如monolog/monolog)的版本号为1.25.0,然后执行composer update monolog/monolog
,则会更新monolog/monolog包到1.25.0版本,其他包不会受到影响。3、composer require
使用频率最高的命令。当我们要往项目中引入某个包的时候,要使用该命令。
该命令执行会更新composer.json文件,并下载相应包版本,同时也会更新composer.lock文件。这样一来,其他项目成员只要拿到composer.lock文件后,执
composer install
命令即可获取到相同的包。
三、composer命令执行流程
四、搭建php框架时,composer的基础用法
1、composer.json中autoload的classmap自动加载
在composer.json中的autoload中添加classmap后,需要执行composer dump-autoload
命令才能真正生效,如下:
"autoload" : {
"classmap" : [
"app/controllers"
]
}
在项目根目录中执行composer dump-autoload
命令后,app/controllers下的类,才会被自动加载。
2、composer.json中autoload的psr-4自动加载
当然,如果按照上面第1点的方式,每次创建一个控制器类,都需要执行composer dump-autoload
命令才能生效,太麻烦,因此psr4就派上用场了:在composer.json中添加
"autoload" : {
"psr-4" : [
"controllers\\": "app/controllers/"
]
}
这样一来,只要执行一次composer dump-autoload
后,在app/controllers/目录下任意添加新的控制器类,都会被自动加载
3、利用composer单个文件自动加载
在开发过程中,往往有些功能函数没必要形成一个类,这个时候我们往往需要一个工具函数,例如:
if (!function_exists('dd')){
function dd(...$args){
foreach ($args as $arg){
var_dump($arg);
}
die();
}
}
这个时候,我们在composer.json文件中添加自动加载,如下:
"autoload": {
"files": [
"app/Helpers/Helper.php"
]
}
最后执行一次composer dump-autoload
,app/Helpers/Helper.php文件即可在全局被自动加载了。