建立 PSR-4 的 Php 包

2020-10-24 06:01:03

【相關學習推薦:

本文是幫助初學者搭建基礎的 php composer 包, 本專案原始碼地址

  • github
  • packagist

目錄結構和初建準備

首先建立一個目錄來存放所有檔案, 這裡我 命名為 util-demo , 目錄中需要包含兩個目錄 src/, tests/, 所有的程式碼需要放置到 src/ 目錄, 所有的測試檔案需要放置到 tests/ 目錄

初始化資料夾, 並使用 git 初始化專案, 便於進行版本管理

$ mkdir util-demo
$ cd util-demo
$ git init複製程式碼

初始化 composer

這裡假定你已經安裝了 composer, 如果沒有安裝, 請到 getcomposer.org/download/ 進行安裝

初始化並輸入包名, 這裡預設使用 duoli/util-demo 包名

$ composer init

Welcome to the Composer config generator  
                                            
This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [duoli/util-demo]: 
複製程式碼

輸入描述

Description []: first util package demo複製程式碼

輸入作者名稱, n 跳過

Author [duoli <[email protected]>, n to skip]: 
複製程式碼

設定包的穩定版本, 預設是 stable, 詳細檢視 minimum-stability (root-only)

Minimum Stability []: 
複製程式碼

安裝型別 : Package Type, 預設是 library

Package Type (e.g. library, project, metapackage, composer-plugin) []: 
複製程式碼

License, 協定, 關於協定部分, 你可以選擇自己需要的協定, 阮老師這裡有一個閱讀指南, 可以進行參考 如何選擇開源許可證?, 對於協定部分的寫法可以參考 許可協定 license 這裡

License []: 
複製程式碼

require

設定三方依賴, 表明當前專案/包是否有依賴於其他包進行開發, 這裡選擇 no,

Define your dependencies.

# 生產依賴
Would you like to define your dependencies (require) interactively [yes]? 
複製程式碼

require-dev

開發依賴, 這裡我們加入 phpunit 作為單元測試依賴

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

Search for a package: phpunit

Found 15 packages matching phpunit

   [0] phpunit/phpunit 
   ...
   [14] brianium/paratest 

Enter package # to add, or the complete package name if it is not listed: 0
Enter the version constraint to require (or leave blank to use the latest version): 
Using version ^8.5 for phpunit/phpunit
Search for a package: 
複製程式碼

當不需要額外增加包的時候, 直接回車, 確認安裝包依賴, 初始化完成

{
    "name": "duoli/util-demo",
    "description" : "first util package demo",
    "require-dev": {
        "phpunit/phpunit": "^8.5"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "duoli",
            "email": "[email protected]"
        }
    ],
    "require": {}
}

Do you confirm generation [yes]? 

Would you like to install dependencies now [yes]? yes
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 29 installs, 0 updates, 0 removals
  - Installing sebastian/version (2.0.1): Downloading (100%)         
  ......     
  - Installing phpunit/phpunit (8.5.8): Downloading (100%)         
sebastian/global-state suggests installing ext-uopz (*)
phpunit/phpunit suggests installing phpunit/php-invoker (^2.0.0)
Package phpunit/php-token-stream is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating autoload files
5 packages you are using are looking for funding.
Use the `composer fund` command to find out more!複製程式碼

上邊初始化完成之後, 我們檔案目錄應該如下所示

.
├── composer.json
├── composer.lock
└── vendor複製程式碼

作為包管理來講, 我們需要忽略 composer.lockvendor 資料夾, 因為在專案中使用此包的時候會進行全域性的安裝, 不提交是為了不產生冗餘程式碼.

我們加入 .gitignore 檔案, 加入這兩個資料夾的忽略, 另外由於要生成 phpunit 測試檔案, 我們還需要加入 .phpunit.* , 我這裡還額外加入了 IDE 的忽略

.gitignore

# ide
.idea

# project
composer.lock
vendor/

# phpunit
.phpunit.*複製程式碼

檔案自動載入 autoload

autoload

這裡是上邊初始化沒有提及到的, autoload 指定了包的載入方式, Composer 可以自動載入包內檔案, 但是你需要指定你的檔案的載入方式, 這裡我們使用的是 psr-4 標準, 詳細的規範可以閱讀 PSR-4 自動載入規範

這裡需要在 composer.json 中追加

   ...    "autoload": {        "psr-4": {            "Duoli\\UtilDemo\\": "src",            "Duoli\\UtilDemoTests\\": "tests"
        }
    }
   ... 
複製程式碼

因為這個載入是後續新增的, 想要識別需要我們手動執行下 composer dumpautoload, 這樣才可以識別我們新增的名稱空間對映

另這裡我額外約定了一個測試的名稱空間, 方便對測試檔案進行名稱空間的目錄識別

travis 測試整合

如果打算在GitHub上託管包,一個不錯優點是整合Travis CI,這是一個持續整合應用程式,它會自動執行單元測試檔案. 當接受 pr 時,會非常有用,因為你可以快速檢視是否所有的測試都通過驗證。

要與 Travis 整合,新增一個名為 .travis.yml 的檔案,並複製以下內容

language: php

php:
    – 7.0
    – hhvm

before_script:
    – composer self-update
    – composer install –prefer-source –no-interaction –dev

script: phpunit複製程式碼

在這裡,不會深入討論使用 Travis 的問題,但這應該是一個很好的開始,你可以自己來進行研究如何使用它.

編寫程式碼

現在可以編寫程式碼了, 開啟 src 目錄建立 File.php 檔案, 複製如下程式碼

class File{    public function extension($filename)    {        return pathinfo($filename, PATHINFO_EXTENSION);
    }

}複製程式碼

如果你曾經檢視過舊的 PHP 包原始碼,可能會發現一個 Duoli/UtilDemo 目錄。PSR-4 不再使用巢狀的目錄結構,而是允許直接在 src 目錄下編寫類

編寫單元測試

現在我們已經編寫了包原始碼,可以開始編寫一些測試了。PHPUnit 需要一個名為 phpunit.xml 的檔案來定義一些設定。在根目錄中建立一個新的phpunit.xml檔案,並複製以下程式碼:

<phpunit
    backupGlobals="false"
    backupStaticAttributes="false"
    bootstrap="vendor/autoload.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="false">
    <testsuites>
        <testsuite name="Duoli Util Test Suite">
            <directory suffix=".php">./tests/</directory>
        </testsuite>
    </testsuites></phpunit>複製程式碼

如果不熟悉這個檔案中意思,不用擔心,你無需關注設定了哪些內容(當前來講), 這個檔案只是定義一些設定和檔案應該如何自動載入的約定.

接下來,在 tests 目錄下,建立一個名為 StrTest.php的檔案,並複製以下程式碼:

<?php namespace Duoli\UtilDemoTests;

use Duoli\UtilDemo\File;
use PHPUnit\Framework\TestCase;

class FileTest extends TestCase
{

    public function testExtension()
    {
        $extension = File::extension('readme.md');
        $this->assertEquals('md', $extension);
    }

}複製程式碼

開啟命令列並執行:

$ ./vendor/bin/phpunit複製程式碼

PHPUnit 會自動執行測試,並給出一個綠色的 OK (1 test, 1 assertion) 輸出。

在編寫測試檔案時,需要確保測試類繼承了 PHPUnit\Framework\TestCase

檔案

最後要做的是建立一個 Readme.md 的檔案。如果打算在 GitHub上受控程式碼,這個檔案會在內碼錶面顯示出來,目的是描述包以及包如何工作.

還應該在原始碼中包含一個許可證。預設情況下,你釋出的任何東西都是你的版權所有,如果你想讓其他人使用你的程式碼,你需要給它一個許可。一個好的選擇是 MIT 許可

釋出到 github 和 Packagist

現在已經完成了你的包,你可以將它推到 GitHub 和 Packagist。

GitHub 是一個託管的 git 儲存庫服務,它使得在軟體共同作業變得非常容易。

Packagist 是查詢和使用 PHP 包的服務商

要將程式碼推播到 GitHub,建立一個新的儲存庫, 然後設定 git 的遠端, 將程式碼推上去即可, 命令是

$ git remote add origin [email protected]:username/demo.git  
$ git push -u origin master  
複製程式碼

在 Github 上整合 Packagist 和 Travis, 需要找到設定, 並且在 Webhooks & Services 部分找到這兩個服務, 整合這兩個服務需要授權 github 賬戶並且設定一些簡單的步驟.

概括

如果以前從未開發過已釋出的 php 包,那麼需要考慮很多問題。然而,一旦你操作過不止一次就不至於這麼複雜了.

PHP 的包結構非常簡單,而 PSR-4 使其更加簡單。一旦瞭解了該結構的每一部分是用於做什麼,其他人閱讀 PHP包就會容易很多.

參考文章

  • How to create a PSR-4 PHP package

相關學習推薦:(視訊)

以上就是建立 PSR-4 的 Php 包的詳細內容,更多請關注TW511.COM其它相關文章!