composer
https://docs.phpcomposer.com/01-basic-usage.html
安装
brew install composer
配置仓库地址
composer config [-g] repo.packagist composer https://packagist.phpcomposer.com
配置全局的composer仓库地址
编辑项目的composer.json或~/.config/composer/config.json,增加repositories一项配置
配置项目的composer仓库地址
常用命令
https://docs.phpcomposer.com/03-cli.html
composer search **
根据关键字查找composer依赖包
composer init
交互式的输入包信息,生成composer.json文件后再补全其他字段信息
composer install [**/***]
根据composer.json文件自动加载依赖包至vendor目录下,最终安装的依赖包版本可能取决于有无composer.lock文件
composer dump-autoload
在vendor目录下自动生成autoload.php
composer update [**/***]
根据composer.json文件更新项目依赖,相当于删除composer.lock文件后执行composer install
composer require [**/***:***]
安装composer依赖
composer validate [**/***]
验证依赖是否可用
composer.json
https://getcomposer.org/doc/04-schema.md
{
"name": "cym/testuse", //包的名称,由作者名称和项目名称组成,使用/分割(包名称可以包含任何字符,包括空格,并且不区分大小写),但惯例是使用小写字母,并用连字符作为单词的分隔
"description": "test use package", //包的功能描述
"version":"1.0.0", //版本, 格式必须遵循 X.Y.Z 或 vX.Y.Z(非必须属性),可选后缀 -dev、-patch、-alpha、-beta 或 -RC
"authors": [ //作者信息 (非必须属性)
{
"name": "caoyunmeng",
"email": "yunmengcao@gmail.com",
"homepage": "https://www.example.com",
"role":"Developer"
}
],
"type": "project", //包的类型(非必须属性)
"homepage":"https://github.com/", //包的源码地址(非必须属性)
"readme":"", //表示README 文档的绝对路径(非必须属性)
"time":"2020-11-23", //表示包的版本发布时间(非必须属性),必须符合 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS 格式
"license": "MIT", //遵循的协议(非必须属性)
"keywords": [ //表示一组用于搜索与筛选的与包相关的关键字(非必须属性)
"Yii2",
"widget",
"bootstrap4",
"adminlte3",
"php"
],
"minimum-stability": "dev", //这个属性定义了按稳定性过滤包的默认值,默认为stable;可用的稳定性标识:dev、alpha、beta、RC、stable。
"require": { //表示必须安装的依赖包列表
"php": ">=7.3.7"
},
"require-dev":{ //表示开发或运行测试时的依赖包列表
"zy/ydweb":"dev-master"
},
"autoload": { //自动加载
"psr-4": { //自动使用的 psr-4 格式
"pf\\arr\\": "src/" // key命名空间,value本地代码路径
}
},
"autoload-dev": {
"psr-4": {
"example\\": "example"
}
},
"extra":{ //表示scripts 使用的任意扩展数据
"yii\\composer\\Installer::postCreateProject": {
"setPermission": [
{
"runtime": "0777",
"web/assets": "0777",
"yii": "0755"
}
]
}
},
"config":{
"optimize-autoloader":"true"
}
}
- 类型
"type": "project"
library: 默认类型,当前包是一个库。可以将文件复制到 vendor 目录。
project: 当前包是一个项目,而不是一个库。
metapackage: 包含需求并将触发其安装的空包,但不包含文件,并且不会向系统写入任何内容。因此这种安装类型并不需要一个 dist 或 source。
composer-plugin: 一个安装类型为 composer-plugin 的包,它有一个自定义安装类型,可以为其它包提供一个 installler
- 遵循的协议
"license": "MIT"
https://spdx.org/licenses/ 常见协议:
Apache-2.0
BSD-2-Clause
BSD-3-Clause
BSD-4-Clause
GPL-2.0-only / GPL-2.0-or-later
GPL-3.0-only / GPL-3.0-or-later
LGPL-2.1-only / LGPL-2.1-or-later
LGPL-3.0-only / LGPL-3.0-or-later
MIT
- 依赖包匹配规则
-确定版本: 1.0.2
-范围版本:>=1.0.2
-连字符范围: 1.0-2.0
-通配符: 1.0.*
-"~":指定向后兼容的最小版本
eg:~1.2 等同于 >=1.2.0 && <2.0.0
~1.2.3 等同于 >=1.2.3 && <1.3.0
-"^":允许大版本前的所有版本
eg:^1.2 等同于 >=1.2 && <2.0.0
^1.2.3 等同于 >=1.2.3 && <2.0.0
- 仓库配置
https://docs.phpcomposer.com/05-repositories.html#Using-private
"repositories": {
"packagist": {
"type": "composer", //指定仓库的类型
"url": "https://packagist.phpcomposer.com" //指定仓库的地址
}
}
type的取值:
composer,Composer包托管仓库,例如 https://packagist.phpcomposer.com;
vcs,版本控制管理系统,例如 https://git.yidian-inc.com:8021/caoyunmeng/hubble-server.git;
pear,PEAR上的包;
package,位于互联网上包;
artifact,代码zip包合集;
path,指向代码具体位置。
- config
https://getcomposer.org/doc/06-config.md
config配置只在项目中发挥作用,常用配置:
缓存dist包优先
"preferred-install":"dist"或composer install|update 添加 --prefer-dist
优化自动加载(性能提升25%-30%)
"optimize-autoloader":"true"或composer install -o
使用Authoritative class maps或apcu cahe缓存空结果
"classmap-authoritative":"true"或composer install –a --classmap-authoritative|--apcu-autoloader
composer.lock
- 当执行
composer install
命令之后,将会根据当前composer.json
文件中指定的依赖包版本生成composer.lock
文件。此后,install
命令将会检查锁文件是否存在,如果存在,它将下载指定的版本(忽略composer.json
文件中的定义)。如果不存在composer.lock
文件,Composer将读取composer.json
并创建锁文件。 - 一般在项目中,会选择将
composer.lock
上传至git
库,用于保证项目成员开发中所有依赖包版本保持一致。但是在库中,一般不会将composer.lock
文件上传至git
库,
创建自己的composer库
https://docs.phpcomposer.com/02-libraries.html
- 创建自己的包结构目录
hello-composer
|
|-- src 包源码
| |-- build 功能代码
|
|-- example 一些实例
|
|-- README.md
|
|-- composer.json 下面生成
- 填写包描述文件(创建composer.json文件)
{
"name": "test/hello-composer",
"description": "Hello, Composer!",
"type": "library",
"require": {
"php": ">=7.0"
},
"license": "MIT",
"authors": [
{
"name": "cym",
"email": "cym@google.com"
}
],
"minimum-stability": "stable",
"autoload": {
"psr-4": {
"test\\": "src/"
}
}
}
- 编写类库,在vendor同级目录下创建src目录,在src目录下创建HelloComposer.php
namespace test;
class HelloComposer
{
public static function greet()
{
echo "Hello, Composer!", PHP_EOL;
}
}
注意:
- 代码风格建议参考PSR-2规范:https://www.php-fig.org/psr/psr-2/,文件命名和路径规范建议参考PSR-4规范:https://www.php-fig.org/psr/psr-4/
示例:
完整类名 | 命名空间前缀 | 文件基目录 | 文件路径 |
---|---|---|---|
\Acme\Log\Writer\File_Writer | Acme\Log\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
\Aura\Web\Response\Status | Aura\Web | /path/to/aura-web/src/ | /path/to/aura-web/src/Response/Status.php |
\Symfony\Core\Request | Symfony\Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php |
\Zend\Acl | Zend | /usr/includes/Zend/ | /usr/includes/Zend/Acl.php |
2. 文件的路径需与composer.json中autoload的值相匹配。
- 引用自己的composer包
新建一个exam项目,引用上文创建的包并查看效果。新建exam文件夹,创建composer.json
{
"name": "test/exam-hello-composer",
"description": "Hello, Composer!",
"type": "project",
"license": "MIT",
"authors": [
{
"name": "cym",
"email": "cym@google.com"
}
],
"require": {
"test/hello-composer": "*"
},
"minimum-stability": "dev",
"repositories": {
"local": {
"type": "path",
"url": "/path/to/hello-composer"
}
}
}
配置文件需要注意两点:
- 如果hello-composer的composer.json文件没有version字段(或不是稳定版),minimum-stability值要是dev(默认是stable),否则无法安装;
- 需添加自定义仓库,type值为path。
- 执行composer install,引入文件,会在vendor目录下自动生成test/hello-composer目录
- 创建项目,使用引用的文件
namespace test;
require "vendor/autoload.php";
use test\HelloComposer;
class Test
{
public static main()
{
HelloComposer::greet();
}
}
Test::main();
发布composer包
将Composer包发布到互联网的方式有几种:
- 打包成zip,上传到任意一个可公开访问的网站;
- 通过版本控制软件,上传到代码仓库;
- 提交到PEAR社区;
- 提交到私有的Composer仓库;
- 提交到Packagist。
如果代码开源,建议提交到Packagist,方便全世界的PHP开发者检索和使用,为Composer生态做贡献。
提交包到Packagist,要经历以下过程:
5.1 在Github创建项目并提交代码;
5.2 在Packagist输入项目地址提交包;
5.3 在Github配置项目,触发Packagist自动更新。
前两步是必须的,第三步可选。本着为提交的包负责的态度,强烈建议完成第三步操作。 提交包的过程涉及到Github和Packagist两个站点,Github和Packagist之间的关系为:Github托管实际的代码和文件;Packagist托管包的作者、包名、版本号、下载量等元数据保。简要说Packagist是索引,Github是内容提供方。
将composer包提交至packagist
前提条件
- github账号
- packagist账号
创建自己的项目
- 在
github
上创建自己的开放型仓库,然后执行git clone
克隆至本地进行开发。在项目根目录下创建composer.json
文件
{
"name": "test/exam-hello-composer",
"description": "Hello, Composer!",
"type": "project",
"license": "MIT",
"authors": [
{
"name": "cym",
"email": "cym@google.com"
}
],
"require": {
},
"minimum-stability": "stable",
"repositories": {
}
}
- 使用
composer validate
验证包是否可用 - 进行项目的开发,然后将代码提交至
github
- 对代码进行
tag
打包git tag -a v1.0.0 -m "package init""
- 登陆
packagist
,点击页面右上角submit
,将github项目地址复制入Repository URL(Git\svn\Hg)
,点击输入框下方check
按钮,当检测没有问题时,chekck
按钮会转变为提交按钮,点击提交即可 - 在本地使用命令
composer create-project
命令拉取packgist
中的框架代码至本地创建新的项目,执行命令:composer create-project yidian/yaf_demo vpn 1.0.0