美文网首页开发技术
学习开发自己的composer包

学习开发自己的composer包

作者: 安小下 | 来源:发表于2017-11-06 22:14 被阅读1135次

    composer是什么

    Composer 不是一个包管理器。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。

    Composer 受到了 node's npm 和 ruby's bundler 的强烈启发。而当时 PHP 下并没有类似的工具。

    composer可以做什么

    Composer 将这样为你解决问题:

    • 你有一个项目依赖于若干个库。
    • 其中一些库依赖于其他库。
    • 你声明你所依赖的东西。
    • Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。

    系统学习composer的使用请移步 composer中文学习

    开发自己的composer组件

    要点:理解composer如何实现自动加载第三方组件; 理解psr-0psr-4的规范; 理解基于psr-0,psr-4,classmap,files如何实现自动加载。 理解Composer和Packagist

    关于安装和使用composer请参考composer中文学习

    创建目录名称

    mkdir try-make-package
    cd try-make-package
    

    这个try-make-package文件夹就是你的包的根目录了,你只需要记住composer.json在包的哪个目录下面,一般那就是包的根目录了。
    现在我们还没有composer.json文件,下面我们来初始化

    初始化扩展包

    ☁  composer init
    
      Welcome to the Composer config generator
    
    This command will guide you through creating your composer.json config.
    
    Package name (<vendor>/<name>) [lingan/try-make-package]:
    Description []: try make a package
    Author [saboran <saboran@163.com>, n to skip]:
    Minimum Stability []: dev
    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]? n
    Would you like to define your dev dependencies (require-dev) interactively [yes]? n
    
    {
        "name": "lingan/try-make-package",
        "description": "try make a package",
        "type": "library",
        "license": "MIT",
        "authors": [
            {
                "name": "saboran",
                "email": "saboran@163.com"
            }
        ],
        "minimum-stability": "dev",
        "require": {}
    }
    
    Do you confirm generation [yes]? yes
    

    经过一番上面的挣扎在当前目录就生成了composer.json文件,下面我们对这个文件进行一些修改

    修改composer.json增加自动加载规范(命名空间和目录映射关系)和环境要求

    {
      "name": "lingan/try-make-package",
      "description": "try make a package",
      "type": "library",
      "license": "MIT",
      "authors": [
        {
          "name": "saboran",
          "email": "saboran@163.com"
        }
      ],
      "minimum-stability": "dev",
      "require": {
        "php": ">=7.0"
      },
      "autoload": {
        "psr-4": {
          "Flower\\Rose\\": "src/Flower/Rose",
          "Flower\\Lily\\": "src/Flower/Lily"
        }
      }
    }
    
    

    创建类文件

    根据上面的命名空间和目录的映射关系,创建对应目录和文件,如下图

    [图片上传失败...(image-53de7f-1510025126244)]

    对应文件内容

    <?php
    /**
     * Created by PhpStorm.
     * User: Lingan
     * Date: 2017/11/6
     * Time: 21:39
     */
    
    namespace Flower\Rose;
    
    
    class Rose
    {
        public function desc()
        {
            echo "this is rose flower";
        }
    }
    
    <?php
    /**
     * Created by PhpStorm.
     * User: Lingan
     * Date: 2017/11/6
     * Time: 21:38
     */
    
    namespace Flower\Lily;
    
    
    class Lily
    {
        public function desc()
        {
            echo "this is lily flower";
        }
    }
    

    测试安装

    以上代码都梳理完毕后,需要composer install来测试我们的包是否可以正常工作此时会在vendor/composer/autoload_psr4.php中生成命名空间和目录的映射关系,被包在一个数组中:

    <?php
    
    // autoload_psr4.php @generated by Composer
    
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    
    return array(
        'Flower\\Rose\\' => array($baseDir . '/src/Flower/Rose'),
        'Flower\\Lily\\' => array($baseDir . '/src/Flower/Lily'),
    );
    
    

    增加.gitignore为git忽略一些文件,增加readme.md为项目增加描述

    .idea
    vendor/
    composer.lock
    

    提交代码到github

    现在自己的Github主页上创建一个新的�仓库然后将项目提交到对应仓库,参考如下

    git init
    git add -A
    git commit -am "init && dev package"
    git remote add origin git@github.com:linganmin/try-make-package.git
    git push -u origin master
    

    [图片上传失败...(image-f29a85-1510025126244)]

    登录自己的packagist submit(自己注册)

    将自己的项目地址粘贴
    [图片上传失败...(image-53e973-1510025126244)]
    点击check,然后点击submit,至此,自己的composer包就提交成功了,
    [图片上传失败...(image-4e653d-1510025126244)]

    测试使用自己开发的包扩展[2017.11.07更新]

    • 创建测试目录
    mkdir test-my-package
    cd test-my-package
    
    • 安装自己的扩展
     composer require lingan/try-make-package dev-master
    ./composer.json has been updated
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Package operations: 1 install, 0 updates, 0 removals
      - Installing lingan/try-make-package (dev-master d7b9f94): Cloning d7b9f941b0 from cache
    Writing lock file
    Generating autoload files
    
    • 安装完成的目录如下图
      [图片上传失败...(image-842407-1510025126244)]

    • 查看autoload_psr4.php

    <?php
    
    // autoload_psr4.php @generated by Composer
    
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    
    return array(
        'Flower\\Rose\\' => array($vendorDir . '/lingan/try-make-package/src/Flower/Rose'),
        'Flower\\Lily\\' => array($vendorDir . '/lingan/try-make-package/src/Flower/Lily'),
    );
    
    
    • 新建首页入口文件index.php,开始测试自己写的包
    <?php
    /**
     * Created by PhpStorm.
     * User: Lingan
     * Date: 2017/11/7
     * Time: 11:04
     */
    require_once './vendor/autoload.php'; // 加载自动加载文件
    
    use Flower\Rose\Rose;
    use Flower\Lily\Lily;
    
    $rose = new Rose();
    $lily = new Lily();
    
    echo $rose->desc();
    echo "\n";
    echo $lily->desc();
    
    • 执行
    php index.php
    this is rose flower
    this is lily flower%    
    

    *** 至此说明我们自己开发的扩展包可以正常使用

    设置Packagist上自动更新扩展包,即当我们更新扩展包提交到GitHub时,Packagist自动更新

    在没有设置自动更新时,Packagist上包详情页会有这样一个提示

    This package is not auto-updated. Please set up the GitHub Service Hook for Packagist so that it gets updated whenever you push!(这个软件包不是自动更新的。请为Packagist 设置GitHub服务钩,以便在您推送时更新!)

    详细设置自动更新软件包的文档地址

    简化步骤如下:

    1. 个人中心页面拿到自己的api令牌
    2. 去当前包在GitHub的地址,点击设置,点击集成和服务,点击添加Packagist服务并配置你的API令牌,以及你的Packagist用户名和账号对应域名
    3. 选择active,点击add service
    4. 设置自动更新结束,之后你更改了自己包扩展的代码提交到GitHub后,很短的时间差就会同步到Packagist

    [图片上传失败...(image-d9338c-1510025126244)]

    结束语

    作为一枚渣渣,发现自己的不足,尝试接触更多新技术和工具,以上文字若有错误欢迎指正

    Happy Coding

    相关文章

      网友评论

        本文标题:学习开发自己的composer包

        本文链接:https://www.haomeiwen.com/subject/mgurmxtx.html