【相關學習推薦:】
本文是幫助初學者搭建基礎的 php composer 包, 本專案原始碼地址
首先建立一個目錄來存放所有檔案, 這裡我 命名為 util-demo
, 目錄中需要包含兩個目錄 src/
, tests/
, 所有的程式碼需要放置到 src/
目錄, 所有的測試檔案需要放置到 tests/
目錄
初始化資料夾, 並使用 git 初始化專案, 便於進行版本管理
$ mkdir util-demo $ cd util-demo $ git init複製程式碼
這裡假定你已經安裝了 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.lock
和 vendor
資料夾, 因為在專案中使用此包的時候會進行全域性的安裝, 不提交是為了不產生冗餘程式碼.
我們加入 .gitignore
檔案, 加入這兩個資料夾的忽略, 另外由於要生成 phpunit 測試檔案, 我們還需要加入 .phpunit.*
, 我這裡還額外加入了 IDE 的忽略
.gitignore
# ide .idea # project composer.lock vendor/ # phpunit .phpunit.*複製程式碼
autoload
這裡是上邊初始化沒有提及到的, autoload
指定了包的載入方式, Composer 可以自動載入包內檔案, 但是你需要指定你的檔案的載入方式, 這裡我們使用的是 psr-4
標準, 詳細的規範可以閱讀 PSR-4 自動載入規範
這裡需要在 composer.json 中追加
... "autoload": { "psr-4": { "Duoli\\UtilDemo\\": "src", "Duoli\\UtilDemoTests\\": "tests" } } ... 複製程式碼
因為這個載入是後續新增的, 想要識別需要我們手動執行下 composer dumpautoload
, 這樣才可以識別我們新增的名稱空間對映
另這裡我額外約定了一個測試的名稱空間, 方便對測試檔案進行名稱空間的目錄識別
如果打算在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 是一個託管的 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包就會容易很多.
相關學習推薦:(視訊)
以上就是建立 PSR-4 的 Php 包的詳細內容,更多請關注TW511.COM其它相關文章!