这一次,真正掌握composer

composer是现代PHP的基石
现代高级编程语言,依赖管理工具是必不可少的。Java有Maven,Python有pip,Nodejs有npm, 而在composer出现之前,PHP只有被广为诟病的Pear, 由于Pear实在太难用,很少PHP开发者用到这个工具。以致于PHP的开发生态很糟糕。
连一个像样的依赖管理工具都没有,让PHP这门占据了web网站开发�主流市场的语言很尴尬。开发过程中,要用到第三方的类库,需要去下载zip包,然后解压,放到相应的目录,处理好命名空间,自动加载的问题,如果这个第三方包还有其他依赖项,还要再次重复这个流程,看着隔壁家python和node.js一个命令行就搞定,显得php开发人员的操作既原始又滑稽。
这场面,好比:

所幸,金光闪闪的composer驾着七彩祥云来了,PHP终于有了真正意义的依赖管理工具。可以说,composer是现代PHP的基石。
composer解决了项目的依赖关系,且实现了自动加载。开发人员只需要几个命令行,就能获取其他开发者的包,PHP开发工作因此变得如同堆积木,可以根据业务的需求,快速方便地拆解组合代码。
奇怪的是,即使compoer已经诞生好些年了,而且所有主流框架都支持composer,可竟然还有不少PHP开发者不用这个工具。甚至还有人觉得composer加大了PHP的学习难度。
持有这种想法的人,就好像是一辈子都用纸笔手工记账,有朝一日,给他配置了电脑,跟他演示了excel是如何地强大。他不为新事物的强大感到震撼惊喜,而是蹙眉不满地说:“这东西太难学了,我还是习惯用纸笔”。
对于持有这种想法的人,我只能两手一摊。心态衰老的年轻人,如果他的内心一直在装睡,任谁也叫不醒。但时代的步伐可不会因为他们的拉后腿而停止前进,只会把他们远远甩在身后...
初识composer
composer的安装步骤,在composr中文社区有详细的说明,点击查看
安装流程
安装的流程很简单,归结为以下几步:
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" # 下载安装脚本 - composer-setup.php - 到当前目录
php composer-setup.php # 执行安装过程
php -r "unlink('composer-setup.php');" # 删除安装脚本
sudo mv composer.phar /usr/local/bin/composer # 全局安装
composer config -g repo.packagist composer https://packagist.phpcomposer.com # 更换国内镜像源
安装完成后,查看composer版本

第一次使用
接下来,我们用composer来安装第一个包
以monolog
包为例,这个包可以让开发者很方便地将日记写入到文件、数据库或其他储存介质中。
- 在项目根目录新建
composer.json
文件,写入以下内容
{
"require": {
"monolog/monolog": "1.2.*"
}
}
- 执行
composer install
指令安装包依赖

- 使用包进行开发

composer已经为我们下载了monolog
包,且生成了autoload.php
自动加载文件
新建monolog.php
文件,内容如下:
<?php
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('monolog.log', Logger::WARNING));
// add records to the log
$log->warn('警告日志');
$log->err('错误日志');
运行脚本:
learnComposer php monolog.php
生成了日志文件monolog.log
[2018-07-12 14:18:14] name.WARNING: 警告日志 [] []
[2018-07-12 14:18:14] name.ERROR: 错误日志 [] []
只需一个配置文件composer.json
,一行指令composer install
,代码中引入autoload.php
,即可完美地使用第三方包。接下来分析composer的包管理规范
composer包管理规范
什么是包?只要存在composer.json
文件的代码都可以称之为一个包。
包名称
包名称由作者+项目名称组成。有些包作者名与项目名是相同的,如mustache/mustache
包名称一定要加上作者,避免冲突。如,同样的是小龙女这个角色,不同人演绎的效果完全不同。如果你只是说你要看小龙女,可能给你的是一个陈妍希版本的小笼包,而不是你一直仰慕的仙女刘亦菲。
那么,我们怎么根据一个包的项目名去获取包的信息呢?以mustache
包为例:
- 在packagist查找

点击进入包信息详情页,可以看到包的安装方法以及版本信息

除了在
composer.json
中写包的安装信息,还可以通过composer require mustache/mustache
这种方式直接安装

- 用
composer search
指令查找

查看包的具体信息 composer show mustache/mustache --all

包版本
在composer.json
中声明安装包时,需要指定包的版本,�版本号的指定有多种格式:
- 确定的版本号
格式:1.0.2
最简单的指定方式,无歧义
- 在一定范围的版本号
可以定义多个范围,用逗号隔开,这将被视为一个逻辑AND处理。一个管道符号|将作为逻辑OR处理。 AND 的优先级高于 OR
>=1.0
: 大于或等于1.0版本
>=1.0,<2.0
: 大于或等于1.0,且小于2.0
>=1.0,<1.1|>=1.2
: 大于或等于1.0且等于1.1,或者大于等于1.2
- 通配符
1.0.*
: 只要满足以1.0开头的版本号均可
~
下一个重要版本
~1.2 相当于 >=1.2,<2.0
~1.2.3 相当于 >=1.2.3,<1.3
^
大于指定的版本
以下用实例演示版本号的区别:
清空根目录,composer.json
内容为:
{
"require": {
"mustache/mustache": "2.6.0"
}
}
执行composer install

接下来,删除vendor
目录,将版本号改为~2.6.0
, 执行composer install
此时,会发现版本号并没有变化

这是因为当我们第一次执行composer install
,会生成composer.lock
文件,这个文件记录了包的指定版本

当我们再次执行composer install
时,�composer会先去composer.lock
中检查有没有相应的包信息,如果有,以composer.lock
的版本为准。如果我们要跳过composer.lock
的限制,需要改用composer update
指令

此时,我们看到,版本已经更新为2.6.1
最后再试下将版本号改为^2.6.0
, 执行composer update

此时,已经更新到最新版本号
composer.lock
锁文件
composer.json
在指定版本时,不一定是精确指定,很多时候是使用范围指定,只有当我们安装了包,才知道最终安装了哪个版本。那么问题来了,如果我们半年后再根据composer.json
来安装包,可能有些包的版本已经升级了,且向下不兼容,这就有可能导致程序报错。为避免这种问题,在执行composer install
之后,composer会生成composer.lock
锁文件。
在锁文件中可以看到完整的包信息,包括包的版本号。
composer install
命令会先检查锁文件是否存在,如果存在,它将下载composer.lock
指定的版本(忽略 composer.json
文件中的定义)
如果在composer.json
中修改了版本号,必须执行composer update
命令,这个命令会根据composer.json
的定义安装包,并更新composer.lock
文件
锁文件非常重要!必须将composer.lock
文件上传到代码仓库,这样才能保证团队各成员所安装的包版本是一致的。
创建项目
composer通过create-project
可以直接创建一个完整的项目,将包所在的代码仓库clone下来
以创建laravel项目为例:
learnComposer composer create-project laravel/laravel Laravel --prefer-dist "5.5.*"

开发与生产环境分开
有些包我们仅需要在本地安装,生产环境并不需要,可以在composer.json
中通过require-dev
进行声明,如:
composer install --no-dev
会忽略require-dev
所声明的包

composer install
会将require-dev
声明的包一并获取

自定义脚本
在Laravel的composer.json
文件中,有这么一段声明:
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
},
表示在执行composer install
时的相应阶段,会自动触发运行脚本

发布自己的包
- github是新建一个仓库

- 创建
composer.json
文件
在项目根目录执行composer init
,生成composer.json
配置文件

- 在packagist提交github仓库地址
在packagist注册账号,然后登录。
提交github仓库地址

包创建成功

如果用的是国内的镜像,暂时还不能拉取,需要等国内镜像同步成功后才能拉取
- 设置自动同步
如果要实现当github仓库代码更新就触发包的自动更新,需要进行以下设置
在github中添加packagist服务

自动同步需要用到packagist的Api token,查看token

提交配置

结语
掌握以上的composer基础操作,在日常开发中已经足够使用。如果你是一个没怎么用过composer的php开发者,强烈推荐你从现在开始就用composer。在我看来,composer不仅仅是一个工具,而是联结php应用的生态,如果没有composer或类似的依赖管理工具,很难想象PHP还能保持活力。
这一次,真正掌握composer的更多相关文章
- Laravel Composer and ServiceProvider
Composer and: 创建自定义类库时,按命名空间把文件夹结构组织好 composer.json>autoload>classmap>psr-4 composer dump-a ...
- 基于Composer Player 模型加载和相关属性设置
主要是基于达索软件Composer Player.的基础上做些二次开发. public class ComposerToolBarSetting { public bool AntiAliasingO ...
- Composer概述及其自动加载探秘
composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具 ...
- composer 出现 configuration does not allow connection to http.......
出现这样的问题是,镜像使用的是http,而原地址是需要https,所以配置下关掉https就好了. 我们来个全局设置的方法: composer config -g secure-http false ...
- 在linux上如何通过composer安装yii
Composer可以理解成一个依赖管理工具 它能解决以下问题 a) 你有一个项目依赖于若干个库. b) 其中一些库依赖于其他库. c) 你声明你所依赖的东西. d) Composer 会找出哪个版 ...
- composer
composer 是PHP框架的包安装工具,类似于bower ,npm.bundler. 是命令行工具,没有图形界面. 系统要求 运行 Composer 需要 PHP + 以上版本.一些敏感的 PHP ...
- composer 报错:Your requirements could not be resolved to an installable set of packages 解决方法
composer 报错: - Your requirements could not be resolved to an installable set of packages xxxxxxxxxxx ...
- composer 使用笔记
使用composer 更新项目比如: composer create-project topthink/think wwwroot dev-master --prefer-dist提示openssl异 ...
- mac composer 安装
在命令行执行 curl -sS https://getcomposer.org/installer | php 如果没安装 curl 执行以下代码 php -r "readfile('htt ...
- composer安装
1.首先到php.net下载对应版本的php,zip版本即可,注意windows需要vc11运行库支持 2.配置path路径添加对php解压目录的引用 3.将php.ini-development ...
随机推荐
- Windows10-Neo4j安装问题及解决方案
暑假都过得差不多了才终于开始搭环境了 1.下载Neo4j Neo4j官网下载翻墙的话还可以 不翻墙的话下了好几次都下不下来 不用下载desktop,下载community server就可以了 2.下 ...
- 四十七.iptables防火墙 filter表控制 扩展匹配 nat表典型应用
1.iptables基本管理 关闭firewalld,开启iptables服务 查看防火墙规则 追加.插入防火墙规则 删除.清空防火墙规则 1.1 关闭firewalld,启动iptables服务 ...
- Jquery检验输入值
1.检验邮件 function chkEmail(strEmail) { if (!/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w ...
- Django系列(四):多表操作
1.创建模型 例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一(on ...
- linux系列(八):cp命令
1.命令格式: cp [选项]... [-T] 源 目的 2.命令功能: 将源文件复制至目标文件,或将多个源文件复制至目标目录. 3.命令参数: -a:此参数的效果和同时指定"-dpR&qu ...
- javascript 闭包(closure)
<script type="text/javascript"> //闭包(closure):内层函数可以引用存在于包围它的函数内的变量,即使外层函数的执行已经结束 ...
- 《MySQL数据分析实战》八句箴言前四句解析
大家好,我是jacky朱元禄,很高兴继续跟大家学习<MySQL数据分析实战>,从本节课程开始,jacky将从SQL语句入手,给大家解析八句箴言: 不管三七二十一,先把数据show来看: 数 ...
- GB∕T 35658平台过检 已通过最新的部标JT/T 808-2019, JT/T 809-2019标准检测
2019年交通部GPS平台检测标准发生了重大变化, 原来的796平台功能标准, 变更为GB/T35658标准, 这个标准其实2017年就公布了, 实际上还是796标准, 但是检测项目,以前是可选的, ...
- Redis学习(一) —— 基本使用与原理
一.数据结构 string Redis字符串是可修改字符串,在内存中以字节数组形式存在. 下面是string在源码中的定义,SDS(Simple Dynamic String) struct SDS& ...
- 深入理解JVM虚拟机4:Java class介绍与解析实践
用java解析class文件 转自https://juejin.im/post/589834a20ce4630056097a56 前言 身为一个java程序员,怎么能不了解JVM呢,倘若想学习JV ...