# COMPOSER

向军大叔每晚八点在 抖音 (opens new window)bilibli (opens new window) 直播

xj-small

Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。

# 安装更新

使用下面命令即安装,但也可以查看官网 (opens new window)了解安装细节

# 安装

MAC/LINUX

使用 brew 安装是最简单的,支持 MAC 与 LINUX 操作系统

brew install composer

也可以使用下面的官方安装方法

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

php -r "if (hash_file('sha384', 'composer-setup.php') === 'c5b9b6d368201a9db6f74e2611495f369991b72d9c8cbd3ffbc63edff210eb73d46ffbfce88669ad33695ef77dc76976') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

php -r "unlink('composer-setup.php');"

homestead 开发环境已经内置

WINDOWS

点击链接 https://getcomposer.org/Composer-Setup.exe 下载,直接安装就可以了。

# 更新

将 composer 更新到最新版本可以获取更多新特性

composer selfupdate

# 国内镜像

使用 composer 安装软件时是从远程服务器下载的,但国内用户访问国外网站会过慢或不能访问。有些机构将国外的软件同步到了国内服务器。我们将 composer 下载的服务器指向到这个国内服务器,就可以实现快速下载软件了。

使用国内镜像可以让我们下载软件包速度更快,下面是使用阿里云镜像 (opens new window)的配置方法。

全局配置

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

取消镜像

composer config -g --unset repos.packagist

项目配置

仅修改当前工程配置,仅当前工程可使用该镜像地址:

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

取消配置:

composer config --unset repos.packagist

# 版本说明

使用 composer 开发软件包,掌握版本号在 composer 的使用非常重要。

# 范围版本

使用 > ,>=,<,<=,!= 指定版本范围,用逗号分隔为逻辑与,用 | 分隔为逻辑或。

示例 说明
1.2.* 大于 1.2 版本且小于 1.3
1.2.5 等于 1.2.5 版本
>=1.2 大于等于 1.2 版本的软件
>=1.2,<=2.5 大于等于 1.2 并且小于 2.5 版本
>2.0 | =1.5 大于 2.0 或等于 1.5
1.0-3.0 大于等于 1.0 并且小于等于 3.0

# 大版本号

使用 ^ 限制大版本号的升级,一般来讲跨大版本号可能会有向下兼容性的问题

示例 说明
^1.5.1 >=1.5.1 并且 <2.0.0
^0.2 >=0.3.0 并且 <0.4.0

# 次版本号

使用 ~ 波浪号是对次版本号的限制

示例 说明
~1.2 >=1.2 并且 <2.0.0,即不超过 2.0 的所有版本
~1.2.3 >=1.2.3 并且 <1.3.0

# 通配符

使用通配符指模糊匹配

示例 说明
1.0.* 大于等于 1.0,小于 1.1 版本

# 稳定版本

在根包 composer.json 文件中定义的minimum-stability属性,决定了我们安装软件包的最低稳定版本,默认为stable即 Release 最终稳定版。如果想安装软件包为devalphabetaRC 版本的需要特殊指定。

下面对版本进行说明

版本 说明
dev 正在开发版本,如 TAG 为 2.0.0-dev
alpha 内部测试版本,如 TAG 为 2.0.0-alpha
beta 公开测试版本,如 TAG 为 2.0.0-beta
RC(Release Candidate) 最终测试版本,如 TAG 为 2.0.0-RC
stable 最终稳定版本,标准 TAG 为 2.0.1

如果您的 composer.json 中没有明确定义稳定版本 (opens new window),则 Composer 将在内部默认为-dev-stable。如果希望明确考虑仅稳定发行版,可以添加后缀-stable

示例 说明
1.2.3 =1.2.3.0-stable
>1.2 >1.2.0.0-stable
>=1.2 >=1.2.0.0-dev
>=1.2-stable >=1.2.0.0-stable
<1.3 <1.3.0.0-dev
<=1.3 <=1.3.0.0-stable
1 - 2 >=1.0.0.0-dev < 3.0.0.0-dev
~1.3 >=1.3.0.0-dev <2.0.0.0-dev
1.4.* >=1.4.0.0-dev <1.5.0.0-dev

# 扩展包管理

PHP 扩展软件包应用商店网址 https://packagist.org (opens new window) ,开发中通过在应用商店中搜索需要的软件包进行安装就可以了。

使用软件前先行访问软件包的 GithubReadme.md 文件或提供的网站查看使用说明。下面列出常用的 composer 命令使用

# 安装软件

根据 composer.lock 或 composer.json 文件下载软件包到 vendor 目录中

composer install

安装 require-dev 字段中列出的包

composer install --dev

跳过 require-dev 字段中列出的包

composer install --no-dev

安装项目

composer create-project houdunwang/hdcms hdcms

安装软件包

composer require houdunwang/wechat

安装指定版本的软件包

composer require "houdunwang/wechat:^3.1"

安装 MASTER 分支的代码

composer require houdunwang/wechat:dev-master

# 查看信息

查看所有安装的软件包

composer show

查看安装的指定软件包的详细信息

composer show houdunwang/wechat

# 更新软件

更新所有扩展包

composer update

更新指令的软件包

composer update houdunwang/wechat

# 删除软件

删除软件包

composer remove houdunwang/wechat

搜索软件包

composer search houdunwang/wechat

# composer.lock

在安装依赖后,Composer 将把安装时确切的版本号列表写入 composer.lock 文件。

提交代码时需要将 composer.lock 文件一并提交,下载代码时将使用 composer.lock 锁定的版本安装,而不使用 composer.json 中的版本,这会使用项目更稳定。

如果不存在 composer.lock 将使用 composer.json 下载软件包,并创建 composer.lock 文件。

使用 composer update 命令时会使用 composer.json 的版本号更新软件包,并更新 composer.lock 文件

# 扩展包开发

开发一个本地包的标准流程是 开发>git->packagist>使用 但是我们在进行本地开发时,尤其是为某些产品开发组件时,比如 laravel 框架等。这样的操作方式非常不方便,我们希望直接在本地开发,并可以正常使用 composer 功能。

# GITHUB

首先在 GITHUB 中创建项目

image-20200522154525278

CLONE 项目到本地

git clone git@github.com:houdunwang/houdunren.git

# 创建项目

进入上面 CLONE 的项目 houdunren 目录中,远行 composer init 创建 composer.json 配置文件。

#项目名称一般以 github仓库名/包名 格式命名
Package name (<vendor>/<name>) [houdunren/houdunren]:

#项目介绍
Description []: 后盾人开源多平台管理系统

#作者以 作者<邮箱> 格式设置
Author [后盾人 <2300071698@qq.com>, n to skip]:后盾人 <2300071698@qq.com>

#安装软件包的最低稳定版本,默认为stable
Minimum Stability []:stable

#项目类型
Package Type (e.g. library, project, metapackage, composer-plugin) []:project
License []:MIT

# 自动加载

下面来定义软件的自动加载机制

类自动加载

在 composer.json 文件中声明 autoload 选项

{
	...
	"autoload": {
    "psr-4": {
      "houdunwang\\houdunren\\": "src"
    }
  },
	...
}

添加类文件src/base/User.php内容如下

<?php

namespace houdunwang\houdunren\base;

class User
{
    static function show()
    {
        return "后盾人";
    }
}

手动修改了 composer.json 文件后需要重新生成缓存文件

composer dump-autoload

文件加载

修改 composer.json 文件的 autoload 选项,在 files 选项中添加自动加载的文件

{
	...
	"autoload": {
    "files": [
      "src/helper.php"
    ],
    "psr-4": {
      "houdunwang\\houdunren\\": "src"
    }
  }
	...
}

添加文件 src/helper.php 内容如下

<?php
function app()
{
    return 'load service';
}

然后更新自动加载缓存文件

composer dump-autoload

# 项目入口

现在添加项目入口文件 public/index.php

<?php

use houdunwang\houdunren\base\User;

#引入自动加载处理
require '../vendor/autoload.php';

echo User::show();
echo app();

# 配置服务器

服务器环境使用 homestead 来说明,其它环境与之类似。

修改 Homestead.yaml 文件添加目录同步与域名绑定,本项目代码放在 ~/code/houdunren目录中

folders:
	...
	- map: ~/code
    to: /home/vagrant/code
  ...
sites:
	...
	- map: houdunren.test
    to: /home/vagrant/code/houdunren/public
  ...

使用 switchHosts 软件配置域名解析

image-20200522171113765

现在通过浏览器访问就可以看到输出内容了

http://houdunren.test

image-20200522171227066

# 软件商店

下面在 https://packagist.org (opens new window) 分享我们上面开发的软件包

# 帐号设置

首先在网站使用 GITHUB 帐号登录与 GITHUB 进行连接授权

image-20200522171920866

也可以在 GITHUB 中查看绑定情况,访问Applications > Authorized OAuth Apps 页面,搜索 packagist 看到以下链接并点击

image-20200522172705408

如果看到以下内容表示绑定成功

image-20200522172751683

# 发布软件

下面我们来将软件发布到 https://packagist.org (opens new window) ,如果下图进行项目提交

image-20200522175053571

提交时出现以下错误

We had problems parsing your composer.json file, the parser reports: The

表示版本库中不存在 composer.json 文件,我们使用 GIT 提交代码到版本库。

但 vendor 目录不用提交,所以创建 .gitignore 文件添加以下内容

...
/vendor
...

然后提交代码

git add .
git commit -m '初始构建'
git push

然后回到 https://packagist.org (opens new window) 再次执行提交,如果看到以下界面表示成功

image-20200522175653795

# 安装软件

软件已经发布到 packagist.org 了,我们来测试下安装

# 基本使用

下面创建目录来安装我们开发的软件包

mkdir hd
composer require houdunwang/houdunren

我们会发现有错误产生,这是告诉我们

Could not find a matching version of package houdunwang/houdunren. Check the package spe   │
  lling, your version constraint and that the package is available in a stability which ma   │
  tches your minimum-stability (stable).

这是因为 composer.json 中指定的minimum-stability 值为stable,即最低要求为稳定版本。

可以修改 "minimum-stability": "dev" 来降低最低安装要求,就可以安装了

composer require houdunwang/houdunren

当然也可以指令 dev-master 来安装 master 分支代码

composer require houdunwang/houdunren:dev-master

# 生成版本

如果项目已经开发完成需要发布稳定版本,进入项目目录执行以下 GIT 指令

#为稳定版本打标签 1.0
git tag v1.0

#推送标签到GITHUB
git push --tags

现在我们会在 GITHUB 看到 tag

image-20200522184423559

也会在 https://packagist.org (opens new window) 看到版本已经自动同步了 image-20200522184528150

# 本地扩展

我们想创建一个扩展的同时,为本地已经存在项目使用。一般流程如下

  1. 修改扩展包后提交生成新版本
  2. 在本地项目上执行 composer update 进行更新

我们希望省掉上面的步骤,直接修改扩展包就可以为本地项目使用,目的已经介绍完了,我们来开始操作。

# 配置文件

比如我们的文件目录在 ~/code/houdunwang/arr

.
├── composer.json
├── src
│   └── Hd.php
└── tests

生成的 composer.json 配置文件,内容如下:

{
  "name": "houdunwang/arr",
  "description": "array extend module",
  "license": "MIT",
  "authors": [
    {
      "name": "houdunren",
      "email": "2300071698@qq.com"
    }
  ],
  "autoload": {
    "psr-4": {
      "Houdunwang\\arr\\": "src/"
    }
  }
}

根据自己的需要自行修改文件内容,比如 require 其他的扩展

# 安装到项目

hdphplaravel 其实是任何 composer 项目的根目录下执行:

composer config repositories.arr path ~/code/houdunwang/arr

这样就将包 arr 软链接到 ~/code/houdunwang/arr 。修改 ~/code/houdunwang/arr 目录下的文件,将影响到 vendor/houdunwang/arr

这里观察 laravel 等 composer 项目根目录下的 composer.json 会多一段内容:

...
"repositories": {
	"arr": {
		"type": "path",
		"url": "/Users/xj/code/houdunwang/arr"
	}
}
...

表示使用我们本地的 composer 包,而非 packagist 下载的包

安装本地包与远程包没有什么区别。

composer require houdunwang/arr:dev-master

至些我们已经完成了,直接在 houdunwang/arr 目录中开发就可以了,而非 vendor/houdunwang/module 目录。

# 常用命令

查看已经安装扩展包信息与版本

composer show -i

查看 composer 使用的镜像

composer config -l -g

# 常见问题

  • 执行composer dump-autoload 等命令时卡住不动

    将 Laravel-Modules 插件生成的模块中的 node_modules 目录删除