溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何創(chuàng)建PSR-4的Php包

發(fā)布時(shí)間:2020-10-26 09:04:50 來源:億速云 閱讀:124 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)如何創(chuàng)建PSR-4的Php包,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

目錄結(jié)構(gòu)和初建準(zhǔn)備

首先創(chuàng)建一個(gè)目錄來存放所有文件, 這里我 命名為 util-demo , 目錄中需要包含兩個(gè)目錄 src/, tests/, 所有的代碼需要放置到 src/ 目錄, 所有的測試文件需要放置到 tests/ 目錄

初始化文件夾, 并使用 git 初始化項(xiàng)目, 便于進(jìn)行版本管理

$ mkdir util-demo
$ cd util-demo
$ git init復(fù)制代碼

初始化 composer

這里假定你已經(jīng)安裝了 composer, 如果沒有安裝, 請到 getcomposer.org/download/ 進(jìn)行安裝

初始化并輸入包名, 這里默認(rèn)使用 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]: 
復(fù)制代碼

輸入描述

Description []: first util package demo復(fù)制代碼

輸入作者名稱, n 跳過

Author [duoli <zhaody901@126.com>, n to skip]: 
復(fù)制代碼

設(shè)定包的穩(wěn)定版本, 默認(rèn)是 stable, 詳細(xì)查看 minimum-stability (root-only)

Minimum Stability []: 
復(fù)制代碼

安裝類型 : Package Type, 默認(rèn)是 library

Package Type (e.g. library, project, metapackage, composer-plugin) []: 
復(fù)制代碼

License, 協(xié)議, 關(guān)于協(xié)議部分, 你可以選擇自己需要的協(xié)議, 阮老師這里有一個(gè)閱讀指南, 可以進(jìn)行參考 如何選擇開源許可證?, 對于協(xié)議部分的寫法可以參考 許可協(xié)議 license 這里

License []: 
復(fù)制代碼

require

設(shè)定三方依賴, 表明當(dāng)前項(xiàng)目/包是否有依賴于其他包進(jìn)行開發(fā), 這里選擇 no,

Define your dependencies.

# 生產(chǎn)依賴
Would you like to define your dependencies (require) interactively [yes]? 
復(fù)制代碼

require-dev

開發(fā)依賴, 這里我們加入 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: 
復(fù)制代碼

當(dāng)不需要額外增加包的時(shí)候, 直接回車, 確認(rèn)安裝包依賴, 初始化完成

{
    "name": "duoli/util-demo",
    "description" : "first util package demo",
    "require-dev": {
        "phpunit/phpunit": "^8.5"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "duoli",
            "email": "zhaody901@126.com"
        }
    ],
    "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!復(fù)制代碼

上邊初始化完成之后, 我們文件目錄應(yīng)該如下所示

.
├── composer.json
├── composer.lock
└── vendor復(fù)制代碼

作為包管理來講, 我們需要忽略 composer.lockvendor 文件夾, 因?yàn)樵陧?xiàng)目中使用此包的時(shí)候會(huì)進(jìn)行全局的安裝, 不提交是為了不產(chǎn)生冗余代碼.

我們加入 .gitignore 文件, 加入這兩個(gè)文件夾的忽略, 另外由于要生成 phpunit 測試文件, 我們還需要加入 .phpunit.* , 我這里還額外加入了 IDE 的忽略

.gitignore

# ide
.idea

# project
composer.lock
vendor/

# phpunit
.phpunit.*復(fù)制代碼

文件自動(dòng)加載 autoload

autoload

這里是上邊初始化沒有提及到的, autoload 指定了包的加載方式, Composer 可以自動(dòng)加載包內(nèi)文件, 但是你需要指定你的文件的加載方式, 這里我們使用的是 psr-4 標(biāo)準(zhǔn), 詳細(xì)的規(guī)范可以閱讀 PSR-4 自動(dòng)加載規(guī)范

這里需要在 composer.json 中追加

   ...    "autoload": {        "psr-4": {            "Duoli\\UtilDemo\\": "src",            "Duoli\\UtilDemoTests\\": "tests"
        }
    }
   ... 
復(fù)制代碼

因?yàn)檫@個(gè)加載是后續(xù)添加的, 想要識別需要我們手動(dòng)運(yùn)行下 composer dumpautoload, 這樣才可以識別我們添加的命名空間映射

另這里我額外約定了一個(gè)測試的命名空間, 方便對測試文件進(jìn)行命名空間的目錄識別

travis 測試集成

如果打算在GitHub上托管包,一個(gè)不錯(cuò)優(yōu)點(diǎn)是集成Travis CI,這是一個(gè)持續(xù)集成應(yīng)用程序,它會(huì)自動(dòng)運(yùn)行單元測試文件. 當(dāng)接受 pr 時(shí),會(huì)非常有用,因?yàn)槟憧梢钥焖俨榭词欠袼械臏y試都通過驗(yàn)證。

要與 Travis 集成,添加一個(gè)名為 .travis.yml 的文件,并復(fù)制以下內(nèi)容

language: php

php:
    – 7.0
    – hhvm

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

script: phpunit復(fù)制代碼

在這里,不會(huì)深入討論使用 Travis 的問題,但這應(yīng)該是一個(gè)很好的開始,你可以自己來進(jìn)行研究如何使用它.

編寫代碼

現(xiàn)在可以編寫代碼了, 打開 src 目錄創(chuàng)建 File.php 文件, 復(fù)制如下代碼

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

}復(fù)制代碼

如果你曾經(jīng)查看過舊的 PHP 包源碼,可能會(huì)發(fā)現(xiàn)一個(gè) Duoli/UtilDemo 目錄。PSR-4 不再使用嵌套的目錄結(jié)構(gòu),而是允許直接在 src 目錄下編寫類

編寫單元測試

現(xiàn)在我們已經(jīng)編寫了包源碼,可以開始編寫一些測試了。PHPUnit 需要一個(gè)名為 phpunit.xml 的文件來定義一些設(shè)置。在根目錄中創(chuàng)建一個(gè)新的phpunit.xml文件,并復(fù)制以下代碼:

<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>復(fù)制代碼

如果不熟悉這個(gè)文件中意思,不用擔(dān)心,你無需關(guān)注設(shè)置了哪些內(nèi)容(當(dāng)前來講), 這個(gè)文件只是定義一些設(shè)置和文件應(yīng)該如何自動(dòng)加載的約定.

接下來,在 tests 目錄下,創(chuàng)建一個(gè)名為 StrTest.php的文件,并復(fù)制以下代碼:

<?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);
    }

}復(fù)制代碼

打開命令行并運(yùn)行:

$ ./vendor/bin/phpunit復(fù)制代碼

PHPUnit 會(huì)自動(dòng)運(yùn)行測試,并給出一個(gè)綠色的 OK (1 test, 1 assertion) 輸出。

在編寫測試文件時(shí),需要確保測試類繼承了 PHPUnit\Framework\TestCase

文檔

最后要做的是創(chuàng)建一個(gè) Readme.md 的文檔。如果打算在 GitHub上托管代碼,這個(gè)文件會(huì)在代碼頁面顯示出來,目的是描述包以及包如何工作.

還應(yīng)該在源代碼中包含一個(gè)許可證。默認(rèn)情況下,你發(fā)布的任何東西都是你的版權(quán)所有,如果你想讓其他人使用你的代碼,你需要給它一個(gè)許可。一個(gè)好的選擇是 MIT 許可

發(fā)布到 github 和 Packagist

現(xiàn)在已經(jīng)完成了你的包,你可以將它推到 GitHub 和 Packagist。

GitHub 是一個(gè)托管的 git 存儲(chǔ)庫服務(wù),它使得在軟件協(xié)作變得非常容易。

Packagist 是查找和使用 PHP 包的服務(wù)商

要將代碼推送到 GitHub,創(chuàng)建一個(gè)新的存儲(chǔ)庫, 然后設(shè)定 git 的遠(yuǎn)端, 將代碼推上去即可, 命令是

$ git remote add origin git@github.com:username/demo.git  
$ git push -u origin master  
復(fù)制代碼

在 Github 上集成 Packagist 和 Travis, 需要找到設(shè)置, 并且在  Webhooks & Services 部分找到這兩個(gè)服務(wù), 集成這兩個(gè)服務(wù)需要授權(quán) github 賬戶并且設(shè)置一些簡單的步驟.

關(guān)于如何創(chuàng)建PSR-4的Php包就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI