包版本
在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还能保持活力。