想要从零开始创建一个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中文网其他相关文章!