【相關(guān)學(xué)習(xí)推薦:php圖文教程】
本文是幫助初學(xué)者搭建基礎(chǔ)的 php composer 包, 本項(xiàng)目源碼地址
- github
- packagist
目錄結(jié)構(gòu)和初建準(zhǔn)備
首先創(chuàng)建一個(gè)目錄來存放所有文件, 這里我 命名為 util-demo
, 目錄中需要包含兩個(gè)目錄 src/
, tests/
, 所有的代碼需要放置到 src/
目錄, 所有的測(cè)試文件需要放置到 tests/
目錄
初始化文件夾, 并使用 git 初始化項(xiàng)目, 便于進(jìn)行版本管理
$ mkdir util-demo $ cd util-demo $ git init復(fù)制代碼
初始化 composer
這里假定你已經(jīng)安裝了 composer, 如果沒有安裝, 請(qǐng)到 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)行參考 如何選擇開源許可證?, 對(duì)于協(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 作為單元測(cè)試依賴
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.lock
和 vendor
文件夾, 因?yàn)樵陧?xiàng)目中使用此包的時(shí)候會(huì)進(jìn)行全局的安裝, 不提交是為了不產(chǎn)生冗余代碼.
我們加入 .gitignore
文件, 加入這兩個(gè)文件夾的忽略, 另外由于要生成 phpunit 測(cè)試文件, 我們還需要加入 .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ù)添加的, 想要識(shí)別需要我們手動(dòng)運(yùn)行下 composer dumpautoload
, 這樣才可以識(shí)別我們添加的命名空間映射
另這里我額外約定了一個(gè)測(cè)試的命名空間, 方便對(duì)測(cè)試文件進(jìn)行命名空間的目錄識(shí)別
travis 測(cè)試集成
如果打算在GitHub上托管包,一個(gè)不錯(cuò)優(yōu)點(diǎn)是集成Travis CI,這是一個(gè)持續(xù)集成應(yīng)用程序,它會(huì)自動(dòng)運(yùn)行單元測(cè)試文件. 當(dāng)接受 pr 時(shí),會(huì)非常有用,因?yàn)槟憧梢钥焖俨榭词欠袼械臏y(cè)試都通過驗(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
目錄下編寫類
編寫單元測(cè)試
現(xiàn)在我們已經(jīng)編寫了包源碼,可以開始編寫一些測(cè)試了。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 DuoliUtilDemoTests; use DuoliUtilDemoFile; use PHPUnitFrameworkTestCase; 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)行測(cè)試,并給出一個(gè)綠色的 OK (1 test, 1 assertion)
輸出。
在編寫測(cè)試文件時(shí),需要確保測(cè)試類繼承了 PHPUnitFrameworkTestCase
文檔
最后要做的是創(chuàng)建一個(gè) Readme.md
的文檔。如果打算在 GitHub上托管代碼,這個(gè)文件會(huì)在代碼頁(yè)面顯示出來,目的是描述包以及包如何工作.
還應(yīng)該在源代碼中包含一個(gè)許可證。默認(rèn)情況下,你發(fā)布的任何東西都是你的版權(quán)所有,如果你想讓其他人使用你的代碼,你需要給它一個(gè)許可。一個(gè)好的選擇是 MIT 許可
發(fā)布到 github 和 Packagist
現(xiàn)在已經(jīng)完成了你的包,你可以將它推到 GitHub 和 Packagist。
GitHub 是一個(gè)托管的 git 存儲(chǔ)庫(kù)服務(wù),它使得在軟件協(xié)作變得非常容易。
Packagist 是查找和使用 PHP 包的服務(wù)商
要將代碼推送到 GitHub,創(chuàng)建一個(gè)新的存儲(chǔ)庫(kù), 然后設(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è)置一些簡(jiǎn)單的步驟.
概括
如果以前從未開發(fā)過已發(fā)布的 php 包,那么需要考慮很多問題。然而,一旦你操作過不止一次就不至于這么復(fù)雜了.
PHP 的包結(jié)構(gòu)非常簡(jiǎn)單,而 PSR-4 使其更加簡(jiǎn)單。一旦了解了該結(jié)構(gòu)的每一部分是用于做什么,其他人閱讀 PHP包就會(huì)容易很多.
參考文章
- How to create a PSR-4 PHP package
相關(guān)學(xué)習(xí)推薦:php編程(視頻)