composer管理php项目代码

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

1、composer能做什么?

Composer 将这样为你解决问题:

a) 你有一个项目依赖于若干个库。

b) 其中一些库依赖于其他库。

c) 你声明你所依赖的东西。

d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)


2、如何将composer依赖管理应用到已有项目?

按照官方文档的提示安装composer工具,并且使composer命令全局可用。
安装完成后在命令行运行composer,可以查看compoer可用的命令:

vagrant@ant:/vagrant$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer 1.10.1 2020-03-13 20:34:27

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display this help message
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi                     Force ANSI output
      --no-ansi                  Disable ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
      --no-plugins               Whether to disable plugins.
  -d, --working-dir=WORKING-DIR  If specified, use the given directory as working directory.
      --no-cache                 Prevent use of the cache
  -v|vv|vvv, --verbose           Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  about                Shows the short information about Composer.
  archive              Creates an archive of this composer package.
  browse               [home] Opens the package's repository URL or homepage in your browser.
  check-platform-reqs  Check that platform requirements are satisfied.
  clear-cache          [clearcache|cc] Clears composer's internal package cache.
  config               Sets config options.
  create-project       Creates new project from a package into given directory.
  depends              [why] Shows which packages cause the given package to be installed.
  diagnose             Diagnoses the system to identify common errors.
  dump-autoload        [dumpautoload] Dumps the autoloader.
  exec                 Executes a vendored binary/script.
  fund                 Discover how to help fund the maintenance of your dependencies.
  global               Allows running commands in the global composer dir ($COMPOSER_HOME).
  help                 Displays help for a command
  init                 Creates a basic composer.json file in current directory.
  install              [i] Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.
  licenses             Shows information about licenses of dependencies.
  list                 Lists commands
  outdated             Shows a list of installed packages that have updates available, including their latest version.
  prohibits            [why-not] Shows which packages prevent the given package from being installed.
  remove               Removes a package from the require or require-dev.
  require              Adds required packages to your composer.json and installs them.
  run-script           [run] Runs the scripts defined in composer.json.
  search               Searches for packages.
  show                 [info] Shows information about packages.
  status               Shows a list of locally modified packages, for packages installed from source.
  suggests             Shows package suggestions.
  update               [u|upgrade] Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.
  validate             Validates a composer.json and composer.lock.

之后,我们新建一个项目,创建一个test-project空目录。在test-project目录下创建一个composer.json文件,用来声明我们的项目依赖。

创建composer.json文件

假设我们现在需要一个库来做日志记录,决定使用 monolog来写日志。传统的方法,是去copy一份monolog的代码到我们的项目里,放在某个目录下(如lib目录),然后将类文件require进来。但composer可以自动地为我们做这些事情,为此,我们只需要在composer.json文件中描述项目的依赖关系:

{
    "require": {
        "monolog/monolog": "1.2.*"
    }
}

这里指出我们的项目需要使用 monolog/monolog 包,从 1.2 开始的任何版本。声明之后,进入test-project目录,在命令行运行 composer install 命令安装依赖:

vagrant@aiouniya:/vagrant/test-project$ composer install
No lock file found. Updating dependencies instead of installing from lock file. Use composer update over composer install if you do not have a lock file.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking monolog/monolog (1.2.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Downloading monolog/monolog (1.2.1)
  - Installing monolog/monolog (1.2.1): Extracting archive
3 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files

安装命令会创建一个composer.lock文件锁定当前的依赖。并且创建了vendor目录放置依赖的包,后续声明的其他依赖也会安装到这个目录下。
安装好依赖后如何使用代码呢?为了使用monlog包,我们需要引入composer的自动加载器。我们在项目根目录下创建一个index.php文件来测试:

<?php


// 引入composer自动加载器(实际上很多用composer管理的mvc框架,都会在他们的入口文件index.php里引入composer自动加载器)
require 'vendor/autoload.php';


/* 使用monlog记录日志 */
// 将Logger类use进来
use Monolog\Logger;
// StreamHandler
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
// 在项目目录下创建logs目录,push warning级别的日志handler
$log->pushHandler(new StreamHandler('logs/warning.log', Logger::WARNING));

// 在warning.log日志文件中写一条warn日志
$log->warn('Hello world');

命令行运行 php index.php测试代码,可以看到在logs目录下成功写入一条日志:
测试monolog包通过composer,我们成功将monolog包引入到了我们的新项目。composer还有很多开源的包,如连接redis、MongoDB的包,发送邮件、excel处理的包,这些包都可以在开源的镜像仓库里找到。假设我们的项目还需要excel处理包,那么只需要在项目目录下运行

composer require phpoffice/phpspreadsheet

composer 就会把 phpspreadsheet 包下载下来放到vendor库。使用这些包极大地简化了开发流程,使开发者不必重复造轮子。再次感谢开源的力量!


3、制作自己的composer包

想像这样一个开发流程,实现某一个项目,需要将php开发团队分成业务组和用户组,业务组负责开发业务相关的代码,用户组负责开发用户相关的代码。业务组的代码中需要用到用户组的代码,如获取用户信息、检验用户合法性等。如何更好的组织不同模块的代码呢?一种可行的实践方案是,将用户组开发的代码制作成私有的composer包,仅供内部使用,业务组通过composer.json文件申明项目的依赖,将用户组开发的包引入进来。这里,我们实践下完整的流程。

(1)新建一个git仓库
首先在码云上创建一个仓库teset-composer用来测试,仓库地址:https://gitee.com/delius/test-composer(这个是笔者的仓库,需要测试可以创建自己的仓库) 。

(2) 添加composer.json文件
为了让我们的仓库能够被compser识别为一个包,我们在仓库里添加一个composer.json文件,编辑这个文件添加包信息:

{
    "name": "delius/test-composer",   
    "description" :"our  test  package",  
    "type":"library", 
    "keywords" :["delius", "ldy", "test composer"],
    "homepage":"https://gitee.com/delius/test-composer",
    "time":"2021-04-30",
    "license":"proprietary",
    "authors": [
        {
            "name": "LawrenceLu",
            "email": "lawrenceliu@muchenglin.com",
            "homepage": "http://www.naderman.de",
            "role": "Developer"
        },
        {
            "name": "Jordi Boggiano",
            "email": "j.boggiano@seld.be",
            "homepage": "http://seld.be",
            "role": "Developer"
        }
    ],
    "support": {
        "email": "support@example.org",
        "irc": "irc://irc.freenode.org/composer"
    },
    "require": {
        "php":">=7.2.0",   	
        "ext-redis":">=5.2.0", 
        "monolog/monolog": "1.2.*",        
        "phpoffice/phpspreadsheet":"*",       
        "predis/predis":"~1.1"
    },
    "autoload": {
        "psr-4": {
            "Delius\\": "src/"
        }
    }
}

name定义了我们的包名,这里直接使用我们的仓库名。license设置为proprietary表明这是一个闭源的包。require字段声明了我们的依赖:需要php版本大于等于7.2.0;需要安装redis扩展,且redis扩展的版本大于等于5.2;最后还需要"monolog/monolog": “1.2."、“phpoffice/phpspreadsheet”:"”、“predis/predis”:"~1.1"三个依赖包。只有这些依赖都满足时,composer才能成功安装delius/test-composer,否则将会报错。我们在autoload字段定义自动加载的映射,将Delius命名空间映射到src目录。

完整的定义参考文档:composer架构

(3) 将制作的包引入到项目中
在delius/test-composer仓库添加测试代码:src\Test\Foo.php

为了将delius/test-composer包引入到我们的项目,我们需要修改test-project目录下的composer.json文件:

{
    "require": {
        "monolog/monolog": "1.2.*",
        "delius/test-composer": "dev-master"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "git@gitee.com:delius/test-composer.git"
        }
    ]
}

require声明了两个依赖,一个是之前我们在上面测试过的monolog/monolog,另一个是我们刚刚在git仓库创建的包,这里指明包的版本dev-master,对应的是git的master分支。详细的版本定义可以查看文档:https://docs.phpcomposer.com/02-libraries.html

repositories字段声明了包的来源:

默认情况下 composer 只使用 packagist 作为包的资源库。通过指定资源库,你可以从其他地方获取资源包。
Repositories 并不是递归调用的,只能在“Root包”的 composer.json 中定义。附属包中的 composer.json 将被忽略。

支持以下类型的包资源库:

  • composer: 一个 composer 类型的资源库,是一个简单的网络服务器(HTTP、FTP、SSH)上的 packages.json 文件,它包含一个 composer.json 对象的列表,有额外的 dist 和/或 source 信息。这个 packages.json 文件是用一个 PHP 流加载的。你可以使用 options 参数来设定额外的流信息。
  • vcs: 从 git、svn 和 hg 取得资源。
  • pear: 从 pear 获取资源。
  • package: 如果你依赖于一个项目,它不提供任何对 composer 的支持,你就可以使用这种类型。你基本上就只需要内联一个 composer.json 对象。

这里指定type为vcs,url是我们的仓库地址。当 Composer 查找资源包时,它会按照顺序进行。默认情况下 Packagist 是最后加入的,因此自定义设置将可以覆盖 Packagist 上的包。

删除test-project目录下原先安装生成的composer.lock文件和vendor目录,重新运行composer insall安装。可以看到delius\test-composer包成功安装到了vendor目录下。可以看到,在我们的项目里并没有声明predis,但是delius/test-composer包声明了需要predis包,所以composer将predis也安装了进来,composer自动为我们解决了依赖关系。
在这里插入图片描述接着我们在test-project/index.php文件里写一段测试代码:

<?php
// 引入composer自动加载器
require 'vendor/autoload.php';


use Delius\Test\Foo;

echo (new Foo)->hello();

命令行测试代码:

vagrant@aiouniya:/vagrant/test-project$ php index.php 
hello,Mr.lawrencevagrant@aiouniya:/vagrant/test-project$

成功输出了结果。如果delius/test-composer仓库更新了代码,那么我们只需要在test-project项目下运行composer update命令即可将最新的代码拉下来。

4、 将composer包开源

如果想和世界分享你写的代码,那么可以在packagist注册一个账号,将自己的git地址提交上去,packagist会去仓库里拉取你的代码,然后制作成镜像,这样别人就能在packagist搜索到你的代码了。

5、 参考链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值