Composer

IG 最初由几位知名 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 提供了几种自动加载类型



classmap
psr-0
psr-4
files
说明:项目代码用 psr-4 自动加载, helper 用 files 自动加载,development 相关用 classmap 自动加载。 psr-0 已经被抛弃了
composer dump-autoload



可以自定义lib 发布到https://packagist.org/



Composer 利用 PSR-0 和 PSR-4 以及 PHP5.3 的命名空间构造了一个繁荣的 PHP 生态系统。



常用命令
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 查看有哪些包
composer self-update 更新 composer.phar文件自身
composer dump-autoload –optimize 优化一下自动加载
composer command –help 以上所有命令都可以添加 –help选项查看帮助信息
composer remove monolog/monolog 移除某个包

1、使用命令composer init生成composer.json文件,并编辑autoload选项内容如下:



其中又包含主要的两个选项: files 和 psr-4。



files就是需要composer自动帮我们加载的函数库(不含类),只要在后面的数组中将函数库的文件路径写入即可。
psr-4顾名思义,是一个基于psr-4(http://www.php-fig.org/psr/psr-4/)规则的类库自动加载对应关系,只要在其后的对象中,以 “命名空间”: “路径” 的方式写入自己的类库信息即可。
修改完成后,只要执行一下composer update,即可完成对应工作。



注意:每次更新完composer.json后,必须执行composer update后才会生效。
$ composer init
Welcome to the Composer config generator



This command will guide you through creating your composer.json config.



Package name (/) [didi/init]: init/init
Description []: test composer init
Author [xiazemin <465474307@qq.com>, n to skip]: xiazemin <465474307@qq.com>
Minimum Stability []: alpha
Package Type (e.g. library, project, metapackage, composer-plugin) []: library
License []: MIT



Define your dependencies.



Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no



{
“name”: “init/init”,
“description”: “test composer init”,
“type”: “library”,
“license”: “MIT”,
“authors”: [
{
“name”: “xiazemin”,
“email”: “465474307@qq.com”
}
],
“minimum-stability”: “alpha”,
“require”: {}
}



Do you confirm generation [yes]? yes



$ ls
composer.json



主要是添加了对于自动加载规范使用psr-4(命名空间和目录映射关系)和环境要求



推送到github后在https://packagist.org/packages/submit发布
发布成功后可以在
https://packagist.org/packages/init/lib
看到如下信息
init/lib
composer require init/lib
test composer init lib



生成项目
$ composer init



Welcome to the Composer config generator



This command will guide you through creating your composer.json config.



Package name (/) [didi/composer_practice]: init/init
Description []: composer init project
Author [xiazemin <465474307@qq.com>, n to skip]: xiazemin <465474307@qq.com>
Minimum Stability []: alpha
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
License []: Apache-2.0



Define your dependencies.



Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no



{
“name”: “init/init”,
“description”: “composer init project”,
“type”: “project”,
“license”: “Apache-2.0”,
“authors”: [
{
“name”: “xiazemin”,
“email”: “465474307@qq.com”
}
],
“minimum-stability”: “alpha”,
“require”: {}
}



Do you confirm generation [yes]? yes
Would you like the vendor directory added to your .gitignore [yes]? yes



3 配置文件说明
Composer使用json作为其配置文件的格式。在工程的根目录下composer.json所定义的包称为root包。在配置文件中有如下的属性。



3.1 require
格式为: “require”:{“vendor-name/package-name”:”version”, …}
名字部分会作为vendor下的路径进行创建
版本支持精确的版本号,也支持范围如>=1.0; >=1.0,<2.0; “,”作为逻辑与,而”!”作为逻辑或的意思。示例中使用了通配符*
版本也支持tag或branch名称。
类似的有require-dev,前者用于声明项目发布版本的依赖包,后者用于声明项目开发或测试中依赖的包。



3.2 autoload
composer支持PSR-0,PSR-4,classmap及files包含以支持文件自动加载。PSR-4为推荐方式。



3.2.1 Files类型
格式:”autoload”:{“files”:[“path/to/1.php”,”path/to/2.php”,…]}
支持将数组中的文件进行自动加载,文件的路径相对于项目的根目录。缺点是麻烦,需要将所有文件都写进配置。



3.2.2 classmap类型
格式:”autoload”:{“classmap”: [“path/to/src1”,”path/to/src2”,…]}
支持将数组中的路径下的文件进行自动加载。其很方便,但缺点是一旦增加了新文件,需要执行dump-autoload命令重新生成映射文件vendor/composer/autoload_classmap.php



3.2.3 psr-0类型
格式:”autoload”:{“psr-0”:{
                            ”name1\space\”:[“path/”,…],
                            ”name2\space\”:[“path2/”,…],
                          }
                 }
支持将命名空间映射到路径。命名空间结尾的\不可省略。当执行install或update时,加载信息会写入vendor/composer/autoload_namespace.php文件。如果希望解析指定路径下的所有命名空间,则将命名空间置为空串即可。
需要注意的是对应name2\space\Foo类的类文件的路径为path2/name2/space/Foo.php



3.2.4 psr-4类型
格式:”autoload”:{“psr-4”:{
                            ”name1\space\”:[“path/”,…],
                            ”name2\space\”:[“path2/”,…],
                          }
                 }
支持将命名空间映射到路径。命名空间结尾的\不可省略。当执行install或update时,加载信息会写入vendor/composer/autoload_psr4.php文件。如果希望解析指定路径下的所有命名空间,则将命名空间置为空串即可。
需要注意的是对应name2\space\Foo类的类文件的路径为path2/space/Foo.php,name2不出现在路径中。



PSR-4和PSR-0最大的区别是对下划线(underscore)的定义不同。PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔符。



3.3 name
格式:”name”:”vendor/package”
如果要发布一个包,你需要指定包的名字信息。



3.4 version
格式:”version”:”1.0.2”
如果要发布一个包,你需要指定包的版本号。版本号的格式为X.Y.Z或vX.Y.Z,其后可以加后缀如-dev,-patch,-alpha,-beta或-RC。除dev外,尾上还可加一个数字,如1.0.0-alpha3。



3.5 description
格式:”description”:”your own description at here!”
如果要发布一个包,可以指定一个简短的介绍



3.5 type
格式:”type”:”library”
说明包的类型,支持如下library,project,metapackage,composer-plugin,默认为library



3.6 keywords
格式:”keywords”:[“logging”,”database”,”redis”]
一个数组的关键字,用于搜索或过滤时使用。



3.7 homepage
可选的,说明项目的网站地址



3.8 time/license
说明项目的时间和License,时间格式为YY-MM-DD HH:MM:SS



3.9 authors
格式:”authors”:[
                    {“name”:”ss”,”email”:”ss@ss.com”,”homepage”:””,”role”:””},…
                ]
用于说明项目的作者信息,为可选的。



3.10 support
格式:”support”:{“emial”:””,”issues”:””,”forum”:””,”wiki”:””,”irc”:”” }
用于说明项目的支持信息



3.11 conflict
用于声明与本包有冲突的包的版本,使用类似于require。



3.12 replace
用于声明需要替换的包,使用类似于require



3.13 provided
用于说明本包实现了某个包的接口



3.14 suggest
格式:”suggest”:{“vendor/package”:”Some description!”}
用于说明可选的,用于增强功能的包及说明。



4 命令行工具
有了配置文件后,便可以使用composer命令来执行,有如下命令
init                 进入交互式向导,在当前目录下生成composer.json文件
install           根据配置进行安装
    选项 –prefer-source
             –prefer-dist
             –dry-run
             –dev/–no-dev
             -o  将psr0/4转换为classmap以提升性能
update [package-name …] 根据配置升级指定的包
search [pattern]                    从packagelist中搜索包
show   [package-name]      显示包的信息
depends package               分析项目中包的依赖
validate                                  验证配置文件内容
status                                    检查代码是修改信息
self-update                          升级composer本身
config                                    配置composer本地或全局选项,可以–list显示所有可配置项   格式为conifg [option] [key] [value…]
create-project vendor/package path version 在指定路径下下载一个项目,默认从packagelist上搜索
dump-autoload                   当类映射中加入新类时,用于更新加载器



5 自动加载



对于composer管理的依赖,如果希望自动加载只需要在文件中加入:require ‘vendor/autoload.php’
拿上面的例子,使用依赖的类就十分简单了,使用packet-name\class-name就可以直接访问了。如
$log = new Monolog\Logger();



6 杂项
composer.lock文件用于记录各依赖的版本,如果使用了VCS,即此文件也需要进行提交。因为如果此文件存在,即composer会按照此文件中的版本进行下载,会忽略composer.json文件。如果需要更新版本,则需要修改composer.json,并执行update命令,此时会下载新版本,并更新composer.lock文件。



Composer 安装



项目提交后, 可以使用composer命令进行安装



composer require michaelexample/demo:dev-master



这里我们增加”:dev-master”是因为这个库还没有发布版本



现在在发布的项目进行打标签发布



关于打标签, 希望能够按照固定的格式进行, 例如这篇语义化版本控制规范 https://semver.org/lang/zh-CN/



git tag 0.0.0



git push –tag



Github会通过webhook将这个事件推送给Packagist, Packagist将更新包信息.



然后我们通过下面的命令进行安装



composer require michaelexample/demo



这个时候省掉了后面的:dev-master



去https://packagist.org/packages/init/lib
发现版本号已经更新



六, composer require 的时候提示找不到包



可能情况一: composer.json 包含了”version”属性, 导致Packagist在同步的时候仅仅同步version匹配上的版本, 其他版本不同步.



https://medium.com/packagist/tagged-a-new-release-for-composer-and-it-wont-show-up-on-packagist-org-or-on-private-packagist-efaf21c212ff



可能情况二: 打标完成后立刻进行require也会提示找不到包, 这个时候建议等个一两分钟就好.



可能情况三: 如果你使用的国内的源, 由于不是实时同步, 所以也可能同步不到, 所以测试的时候最好切换到Packagist源.



Category lang