想要從零開始創建一個PHP包並與其他PHP開發者共享? Composer,這個依賴管理工具,讓這個過程變得輕而易舉!得益於Composer,PHP擁有頂級的包生態系統之一。讓我們一起深入探討,逐步學習如何創建PHP包。
本文主要面向PHP新手(或PHP包編寫新手),旨在幫助他們學習如何從零開始創建PHP包。
創建新的PHP包需要完成以下幾項任務:
composer.json
文件雖然我們可以先創建一個空的GitHub項目並將其克隆到本地,但我們將直接在本地創建一個新文件夾,初始化項目,然後之後再將源代碼推送到GitHub:
$ mkdir example-package $ cd ./example-package $ git init $ echo "/vendor/" >> .gitignore $ composer init $ git add . $ git commit -m"第一次提交" # 稍后您可以添加远程仓库并推送源代码
composer init
命令將引導您以交互方式設置項目,設置包名稱、作者、許可證等值,並蒐索包依賴項。您可以隨意填寫這些信息,但為了簡潔起見,以下是我們的起點:
{ "name": "laravelnews/feeds", "description": "获取Laravel-News.com的文章", "type": "library", "require": {} }
我們擁有了包的基本配置,但它不會完成太多工作。如果包只使用核心PHP語言,則某些包不需要任何依賴項。無論如何,您都需要設置自動加載,以便您的包用戶可以在他們的項目中加載函數和類。
準備好將本地檢出連接到像GitHub這樣的版本控制系統時,您可以按照添加遠程倉庫的說明操作。它可能類似於以下命令:
git remote add origin git@github.com:laravelnews/example-package.git
創建基本的composer.json
結構後,我們可以繼續創建源代碼。您需要決定要在項目中存儲源代碼的位置。文件夾可以隨意命名,但典型的“標準”是src/
或lib/
。 Composer不關心您使用哪個路徑,但是您需要指示Composer使用PSR-4自動加載文件。讓我們使用src
文件夾並為我們的示例包創建一個類:
$ mkdir src/ $ touch src/Api.php
接下來,打開composer.json
文件並使用"autoload"
鍵配置自動加載器:
{ "name": "laravelnews/feeds", "description": "获取Laravel-News.com的文章", "type": "library", "require": {}, "autoload": { "psr-4": { "LaravelNews\Feed\": "src/" } } }
autoload.psr-4
鍵中的屬性將PHP命名空間映射到文件夾。當我們在src
文件夾中創建文件時,它們將映射到LaravelNewsFeed
命名空間。對於此示例,我們創建了一個Api.php
文件,該文件請求並返回Laravel News JSON feed。如果您正在學習,請將以下代碼添加到src/Api.php
:
<?php namespace LaravelNews\Feed; class Api { public function json(): array { $json = file_get_contents('https://laravel-news.com/feed/json'); return json_decode($json, true); } }
我們如何立即嘗試我們的新類?
有幾種方法,例如通過本地Composer依賴項在另一個項目中需要此包,甚至將代碼推送到GitHub並在我們的包上使用dev-main
執行composer update
。但是,我們也可以在項目的根目錄中創建一個index.php
文件來試用它:
$ mkdir example-package $ cd ./example-package $ git init $ echo "/vendor/" >> .gitignore $ composer init $ git add . $ git commit -m"第一次提交" # 稍后您可以添加远程仓库并推送源代码
我們使用了Composer的自動加載器,它知道如何加載我們包的文件。為了讓Composer理解如何找到我們的文件,我們需要運行composer install
:
{ "name": "laravelnews/feeds", "description": "获取Laravel-News.com的文章", "type": "library", "require": {} }
您也可以在將命名空間添加到composer.json
後運行dump-autoload
命令來更新Composer的自動加載器。
運行index.php
文件使我們可以快速開始使用我們的包,但是,我們也可以通過創建一個測試套件來開始使用我們的代碼。讓我們深入研究如何設置它!
我建議您為參與的任何項目編寫測試,並且我喜歡儘早設置測試。在創建PHP包時,最常見的測試框架是PHPUnit。我最近最喜歡的選擇是Pest PHP,我認為您會喜歡它易於設置的方式!
Composer包有兩組需求:require
部分包含包運行所需的包,require-dev
部分包含測試所需的包。到目前為止,我們沒有任何require
包,如果您不需要其他包依賴項,則可能會發生這種情況。
我懷疑您不想從頭開始編寫自己的測試框架,因此我們即將安裝我們的第一個開發依賴項。我們也不總是想向實時JSON端點發出請求,因此我們還將安裝一個模擬庫(Mockery)來模擬HTTP調用:
git remote add origin git@github.com:laravelnews/example-package.git
提示:我建議通過composer.json
中的以下配置選項來配置包排序,以保持依賴項井然有序:
$ mkdir src/ $ touch src/Api.php
安裝Pest和Mockery後,我們可以通過--init
標誌初始化Pest。創建文件後,我們可以運行pest
來測試我們的代碼:
{ "name": "laravelnews/feeds", "description": "获取Laravel-News.com的文章", "type": "library", "require": {}, "autoload": { "psr-4": { "LaravelNews\Feed\": "src/" } } }
您可以按照自己想要的方式組織包的測試,我建議您查看Pest文檔以了解有關設置Pest的完整詳細信息。
接下來,讓我們創建一個簡單的類,我們可以用它來演示包測試。此類將從Laravel News JSON feed獲取最新文章並返回最新文章。
我們將這個虛構的類命名為NewsChecker
,並將其添加到src/NewsChecker.php
文件中,內容如下:
<?php namespace LaravelNews\Feed; class Api { public function json(): array { $json = file_get_contents('https://laravel-news.com/feed/json'); return json_decode($json, true); } }
請注意,它將Api
類作為依賴項,我們將在測試中模擬它。
接下來,我們將在tests/Feature/NewsCheckerTest.php
文件中創建此文件,並添加以下測試以驗證latestArticle()
方法:
$ mkdir example-package $ cd ./example-package $ git init $ echo "/vendor/" >> .gitignore $ composer init $ git add . $ git commit -m"第一次提交" # 稍后您可以添加远程仓库并推送源代码
您可以運行這些測試並通過運行vendor/bin/pest
來驗證代碼是否有效。您可以隨意刪除運行pest --init
後創建的示例測試。
我們已經涵蓋了很多方面,從初始化Git倉庫,使用composer.json
配置PHP包,添加源代碼和測試,以及使用Pest運行它們。從這裡開始,您就可以在Packagist上發布您的包了!
我建議您註冊並查看Packagist.org上的文檔,您將在其中發布新版本的包。在Packagist上更新包版本的過程可以自動化,這意味著當您標記包的新版本時,它們將自動顯示在Packagist.org上。
我們逐步學習了從零開始創建包的過程,但是如果您使用GitHub,為您的組織或個人項目創建模板倉庫可以更快地完成!有一些社區傑出的包框架可以用作您下一個Composer包的起點:
{ "name": "laravelnews/feeds", "description": "获取Laravel-News.com的文章", "type": "library", "require": {} }
以上是如何構建您的第一個PHP軟件包的詳細內容。更多資訊請關注PHP中文網其他相關文章!