動手開發composer擴展

原文地址:學習開發自己的composer包

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 <[email protected]>, 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": "[email protected]"
        }
    ],
    "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": "[email protected]"
    }
  ],
  "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 [email protected]:linganmin/try-make-package.git
git push -u origin master

 

登錄自己的packagist submit(自己註冊)

將自己的項目地址粘貼

點擊check,然後點擊submit,至此,自己的composer包就提交成功了,
 

測試使用自己開發的包擴展

  • 創建測試目錄
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上自動更新擴展包,即當我們更新擴展包提交到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://www.jianshu.com/p/535af12c31ca
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章