学习开发自己的 Composer 包,并使用 GitHub 实时更新到 Packagist

2 篇文章 0 订阅
2 篇文章 0 订阅

composer 是什么

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

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

composer 可以做什么

Composer 将这样为你解决问题:

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

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

开发自己的 composer 组件

要点:理解 composer 如何实现自动加载第三方组件;理解 psr-0 和 psr-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"
    }
  }
}

创建类文件

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

 

对应文件内容

<?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

 

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

将自己的项目地址粘贴

 


点击 check,然后点击 submit,至此,自己的 composer 包就提交成功了,

测试使用自己开发的包扩展 [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
  • 安装完成的目录如下图

     

  • 查看 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

 

结束语

参考文献:

https://laravel-china.org/articles/6652/learn-to-develop-their-own-composer-package-and-to-use-packagist-github-updates

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值