Composer 包開發竟然這麼簡單

composer 是用來幹嗎的?

對於不瞭解composer的同窗來講,確定會有這個疑問。php

這個單詞常常在網上看到,特別是在 GitHub 中,在使用 LaravelYii 時也常常看到這個詞,在安裝的時候推薦使用 composer 安裝?難道只是安裝的時候使用嗎?我也使用過其餘框架,爲何 ThinkphpCodeigniter 不用composer安裝呢?html

帶着這些疑問,咱們進行學習。laravel

composer 官方網址:www.phpcomposer.comgit

composer 是 PHP(5.3+) 用來管理依賴關係的工具。程序員

長久以來,PHP的開源方式都是項目級的,就是說一開源就是一個項目,好比一整套的CMS(Dede、WordPress、discuz)、一整套框架(Thinkphp、Codeigniter)。爲啥呢?其中一個很重要的緣由是你很差拆開,若是拆開的話,沒有一個有效的管理工具組合起來,致使拆開的小模塊你們無人問津。github

而後 composer 出現了,它就是一個有效的管理工具,它負責管理你們拆開的小模塊,而後進行有效的整合,使之成爲一個完整的項目。web

好比,記錄日誌使用 monolog/monolog ,HTTP client使用:guzzlehttp/guzzle 等等。json

composer 包的平臺:packagist.org,這裏麪包含了大量的優秀的安裝包,咱們就很輕鬆一個 composer 命令就能夠將優秀的代碼用到咱們項目中來。api

做爲一名驕傲PHPer,咱們總不能永遠只使用別人的開發包,咱們必須本身動手開發一個包給別人用,給本身用。bash

咱們既然知道了它有這麼多的好處,就讓咱們去學習他吧,先從 composer 的安裝提及。

composer 是如何安裝的?

官方入門文檔:docs.phpcomposer.com/00-intro.ht…

經過上述的方法,能夠進行安裝完成。

接下來咱們以 GitHub 結合 Composer 工具來進行示例講解如何開發一個 Composer 包。

composer 包是如何開發的?

好比,開發一個處理數字的 composer 包。

在 GitHub上 建立一個項目

  1. 登陸 GitHub(若是沒有帳號,請進行建立),點擊右上角「+」,選擇「New repository」。
  2. 在建立界面中,Repository name 填寫「numberFormat」,Description是選填的,暫時先不填, 接着在 Public(GitHub推薦的方式,免費,全部人都能訪問)和 Private(收費,指定人才能訪問,2019-01-09後對我的開發者免費了)中選擇「Public」,接着在勾選「Initialize this repository with a README」,點擊「Create Repository」按鈕後建立成功。

至此,表示在GitHub上已經建立了一個名爲「numberFormat」的空項目。

接下來,須要將遠程的項目 clone 到本地(Git命令行、Git客戶端)進行編碼。

學習建立 composer.json

composer.json 有哪些參數,如何編寫,請參考文檔:docs.phpcomposer.com/04-schema.h…

一個項目要調用開發包,經過composer.json就能夠知道該樣去加載文件。

composer.json 可使用兩個方式建立,一種是composer init,另外一種是手工建立。

我們一塊兒先執行下composer init 看看效果。

在本地建立numberFormat目錄,而後 git clone 剛纔建立的項目。

//進入到本地numberFormat目錄
composer init

Welcome to the Composer config generator

This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [root/number-format]:number-format/number-format

Description []:一個處理數字的包

Author [XinLiang <109760455@qq.com>, n to skip]:  //回車

Minimum Stability []: //回車

Package Type (e.g. library, project, metapackage, composer-plugin) []: //回車

License []: //回車

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]?no

Would you like to define your dev dependencies (require-dev) interactively [yes]?no

{
    "name": "number-format/number-format",
    "description": "一個處理數字的包",
    "authors": [
        {
            "name": "XinLiang",
            "email": "109760455@qq.com"
        }
    ],
    "require": {}
}

Do you confirm generation [yes]?  //回車

複製代碼

至此,本地numberFormat目錄就看到 composer.json 文件了,固然能夠直接在目錄下按照這個格式進行手工建立,後期直接編輯該文件便可。

建立項目編碼內容

開發包結構以下:

--src 源碼目錄(必須)

--tests 單元測試目錄(非必須)

咱們按照既定的目錄結構去建立目錄和文件,而後再到composer.json裏面修改一下便可。

接下來,在src目錄中建立一個類(NumberFormat.php):

/**
 * 數字格式化類
 * @author XinLiang
 */

namespace numberFormat;

class NumberFormat
{
    /**
     * 格式化字節
     * @param int $num       數字
     * @param int $precision 精準度
     * @return string
     */
    public static function byte_format($num = 0, $precision = 1)
    {
        if ($num >= 1000000000000)
        {
            $num = round($num / 1099511627776, $precision);
            $unit = 'TB';
        }
        elseif ($num >= 1000000000)
        {
            $num = round($num / 1073741824, $precision);
            $unit = 'GB';
        }
        elseif ($num >= 1000000)
        {
            $num = round($num / 1048576, $precision);
            $unit = 'MB';
        }
        elseif ($num >= 1000)
        {
            $num = round($num / 1024, $precision);
            $unit = 'KB';
        }
        else
        {
            return number_format($num).' Bytes';
        }

        return number_format($num, $precision).' '.$unit;
    }
}
複製代碼

修改 composer.json

{
    "name": "number-format/number-format",
    "description": "一個處理數字的包",
    "authors": [
        {
            "name": "XinLiang",
            "email": "109760455@qq.com"
        }
    ],
    "minimum-stability": "dev",
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-4": {
            "numberFormat\\": "src/"
        }
    },
    "license": "MIT"
}
複製代碼

至此,咱們的開發包已經完成,接下來咱們來測試下這個包是否可用。

測試開發包

在本地numberFormat目錄下,經過composer install 安裝

composer install

Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files

//表示安裝成功
複製代碼

驚奇的發現,在本地numberFormat目錄多一個vendor目錄。

在tests目錄建立 NumberFormatTest.php

/**
 * 數字格式化測試類
 * @author XinLiang
 */

require '../vendor/autoload.php';

use \numberFormat;

$number = '102400010';
echo numberFormat\NumberFormat::byte_format($number);

//輸出:97.7 MB
複製代碼

至此,測試成功,接下來就是要發佈到packagist平臺,給廣大開發者見面了。

發佈到 packagist 平臺

packagist.org 爲 composer 安裝包的平臺(可用GitHub帳號登陸)。

  1. 現將本地代碼提交到GitHub。
  2. 發佈到 packagist 平臺,登陸後在首頁的右上角有一個"Submit"按鈕,點擊便可進入開發包提交的界面。在「Repository URL (Git/Svn/Hg)」輸入框中,輸入GitHub項目的地址,點擊「Check」按鈕,稍微等待幾秒鐘,會顯示驗證成功,並顯示出「Submit」按鈕,點擊即完成了開發包的提交了。

恭喜你,這個開發包能夠在任何支持 composer 的PHP框架中使用了。

那麼問題來了,剛纔咱們的包寫的有的簡陋,後期咱們維護代碼,新增代碼還須要按照原來的方式操做一遍嗎?

不!由於咱們能夠在GitHub平臺設置代碼更新,同時能讓 packagist.org 自動更新,是否是很酷!

在GitHub中找到代碼倉庫,而後選擇"settings" -> 「Webhooks」 ,默認是綁定自動更新的。

若是未綁定,能夠這樣設置:"settings" -> 「Webhooks」 -> "Add webhook" ->

  1. Payload URL填寫:「packagist.org/api/github」
  2. Content type填寫:「application/json」
  3. Secret填寫:「packagist提供的token」
  4. 其餘的默認便可
  5. 點擊「Add webhook」 完成。

至此,後期咱們更新代碼後會自動同步到 packagist.org 上。

//其餘開發者能夠這樣獲取包
composer require number-format/number-format:dev-master
複製代碼

爲何會有:dev-master,爲何引用其餘的包不用這樣設置?

由於咱們引用的其餘包都是穩定包,默認爲:-stable。

是由於咱們 composer.json 中設置了 minimum-stability 屬性,這個能夠了解下「版本約束」,在這就很少說了。

當咱們在發佈包後,若是獲取不到報錯怎麼辦,有多是鏡像的問題。

composer 設置鏡像地址

//查看全局設置
composer config -gl

//第一種:設置國內鏡像
composer config -g repo.packagist composer https://packagist.phpcomposer.com

//第二種:設置國內鏡像
composer config -g repo.packagist composer https://packagist.laravel-china.org

//第三種:設置國內鏡像
composer config -g repos.packagist composer https://php.cnpkg.org
複製代碼

小結

經過這篇文章,解決了上述提到的三個問題:

  1. composer 是用來幹嗎的?
  2. composer 是如何安裝的?
  3. composer 包是如何開發的?

看完後,是否是以爲 Composer 包開發原來這麼簡單,做爲驕傲的程序員,去開發屬於本身的 Composer 包吧!

原文地址

Composer 入門後,接下來該看看這篇文章了

相關文章
相關標籤/搜索