代码重用带来了依赖性管理问题,而依赖性管理历来是一个相当人工且容易出错的过程。幸运的是,近年来大多数编程语言都通过引入各种依赖性管理工具来解决这一问题。在 PHP 生态系统中,Composer 因其易用性、灵活性和广泛采用而成为标准工具。
尽管 Composer 是为依赖关系管理而设计的,但您也可以用它来完成以下任务:
- 自动加载:自动加载外部库中的类和函数,使您的代码可以随时访问这些类和函数,并简化将外部代码集成到项目中的过程。
- 代码生成:为项目生成模板代码,如配置文件或其他常用代码片段,以加快开发过程并确保一致性。
- 脚本:内置脚本系统可自动执行常见任务,如运行测试或从代码库中生成文档。这有助于简化开发工作流程,减少手工操作。
本教程将逐步指导您创建自己的 Composer 软件包,并将其发布到 Packagist,这是一个供全球开发人员在自己的项目中使用的 PHP 软件包存储库。
Composer 如何工作?
首先,让我们了解一下 Composer。简单来说,Composer 的工作原理是使用一个 composer.json 文件,其中包含 PHP 项目中依赖项的定义。它从一个集中的软件仓库中查找这些软件包,然后使用软件包仓库自动下载并安装这些依赖项。
假设你已经在 PHP 工作环境中安装了 Composer,下面是它的依赖关系下载和安装过程:
- 在项目根目录下的 composer.json 文件中定义项目所需的依赖项。该文件包括所需的库及其版本信息,以及这些库的其他配置设置或依赖项。
- 在 Composer 中使用
install
等命令解决依赖关系,安装所需的依赖关系;update
更新现有的依赖关系;require
在 composer.json 文件中添加新的依赖关系。执行命令时,Composer 会读取 composer.json 文件以确定所需的依赖项,检查软件包仓库中适合 PHP 环境的每个依赖项的最新版本,然后检查是否存在冲突或版本限制。 - Composer 会将所需的依赖项(包括库)下载并安装到项目的 vendor 目录中。Composer 会创建一个 composer.lock 文件,记录所安装依赖项的确切版本。
- Composer 会设置一个自动加载器,从已安装的依赖项中自动加载类和函数。这样就能在项目中轻松使用已安装的库,而无需手动包含每个文件。
简而言之,Composer 简化了 PHP 项目中的依赖关系管理,使安装、更新和使用外部库和框架变得更加容易。
创建并发布 Composer 软件包
本教程将向您展示如何创建一个名为 tempconv 的简单 PHP 库,用于将摄氏温度转换为华氏温度,反之亦然。
准备工作
在开始之前,您需要准备好以下几样东西:
- 系统中已正确安装 PHP 和 Composer 在撰写本文时,Composer 的最新版本是 v2.6.6,但这些说明应适用于任何 v2 版本。
- GitHub 账户,用于创建代码托管仓库。
- 一个 Packagist 账户,用于发布您的库。
创建项目仓库
为本教程创建自己的 GitHub 仓库,在此推送完成的库代码和文件。
在 GitHub 上创建项目库。
本教程使用的项目名称为 tempconv。 在 “描述 “字段中,提供有关应用程序的简要细节。选中添加 README 文件的复选框,为 Add .gitignore 选项选择 Composer 模板,并选择许可证 – 本教程使用 MIT License。最后,点击 Create repository。
克隆版本库
将刚刚创建的版本库克隆到本地计算机上。别忘了用你自己的 URL 替换这里和本教程中的 URL:
$ git clone https://github.com/rexfordnyrk/tempconv.git
这会在当前工作目录下创建一个名为 tempconv 的目录。此时,该目录只包含 README.md、LICENSE 和 .gitignore 文件,但您还将在此创建软件包文件。
创建 PHP 库
在项目目录中,添加一个名为 TemperatureConverter.php 的文件,其中包含以下代码:
<?php namespace Rexfordnyrk\Tempconv; class TemperatureConverter { //Caller must provide the temperature value and the unit either C Celsius or F Fahrenheit public function convert($temperature, $unit) { //Checking whether the unit we're working with is Celsius or Fahrenheit if ($unit === 'C') { $fahrenheit = ($temperature * 9 / 5) + 32; return $fahrenheit; } elseif ($unit === 'F') { $celsius = ($temperature - 32) * 5 / 9; return $celsius; } else { //Throwing error if the unit provided is neither C nor F throw new \InvalidArgumentException('Invalid unit, only C (Celsius) or F (Fahrenheit) are allowed'); } } }
该类有一个名为 convert
的方法,它将温度和单位作为参数,并返回转换后的温度。如果单位无效,则会抛出异常。
现在就到此为止。在现实世界中,你可能会编写单元测试,以确保代码在修改或更新后能按预期运行。
创建 composer 包
有了库代码,就该把它制作成一个 Composer 包了。你将使用向导一步步为你的软件包生成 composer.json 文件,我们还将介绍在将代码推送到版本库之前将其组织成软件包的一些最佳实践。
生成 composer.json 软件包文件
虽然你可以在项目目录根目录下手动写入 composer.json 文件的内容,但最好还是使用下面的 Composer 命令来生成它:
$ composer init
这条命令会让你一步步完成一个小向导。你对软件包名称、描述、作者信息和许可证类型等提示的回答将生成软件包的 composer.json 文件。
Composer 的文档概述了预期值,以及你可以用来定义项目的 composer.json 的其他选项。
使用 composer init 生成配置。
请注意,向导会在适当的地方为问题提供预定义的答案,例如从 git 导出你的姓名和电子邮件。如果你喜欢,可以随意更改。
该库的功能不依赖于任何其他软件包,因此可以对指定依赖关系的问题回答 “No“。
向导会显示生成文件内容的预览,并要求您确认以完成向导。
整理软件包文件
完成向导后,除了 composer.json 文件外,还会创建两个目录:
- 存放源代码的 src 目录
- 用于存放下载的依赖项的 vendor 目录
将 TemperatureConverter.php 文件移到 src 目录。如果你的库有依赖库,运行 composer install
生成自动加载器并安装依赖包。
将代码上传到 GitHub
将你的修改和新文件添加到 Git:
$ git add -A
提交对本地版本库所做的更改,并将其推送到 GitHub 上的远程版本库,以便在下一节中轻松发布项目:
$ git commit -am "Initial Release" && git push
为你的程序库创建发布版本
有了您的代码,您就可以在您的 repo 中创建一个带有版本号的库发布版本,这样其他开发者就可以跟踪您的稳定版和重要更新。
导航到 GitHub 上的版本库,点击 “About” 部分下方的 “Releases“。在 “Releases” 页面,你现在应该什么都没有,点击 “Create a new release“。
GitHub 的发布页面。
填写有关发布的一些细节,如标签版本和发布标题。标签版本应是该发布的唯一标识符(例如:v1.0.0),发布标题应描述发布中包含的更改(例如:Initial release)。
您还可以选择添加版本说明。如果要上传文件,如编译后的二进制文件或源代码存档,可将文件拖放到 Attach binaries by dropping them here or selecting them 区域,但本教程不需要这样做。
在 GitHub 上输入初始版本的详细信息。
点击 “Publish release” 创建发布版本。
现在你的项目应该可以在版本库的 “Releases” 页面上找到。用户可以下载任何附加文件并查看发布说明。此外,如果你为发布添加了标签,其他开发者就可以使用该标签查看发布中包含的确切代码。
您的程序库已经准备好与全世界分享。让我们在 Packagist 上以软件包的形式发布它。
开始使用 Packagist
Packagist 是 PHP 的主要软件包仓库。它为开发人员提供了一个发布和共享 PHP 软件包的中心位置,其他开发人员也可以在自己的项目中发现和使用这些软件包。让我们发布您的软件包!
导航到 Packagist 网站,点击 Login,然后选择 GitHub 作为登录方法,使用您的 GitHub 账户进行身份验证。
使用 GitHub 在 Packagist 上注册。
单击 Authorize,允许 Packagist 访问您的帐户。
使用 GitHub 成功登录 Packagist。
在 Packagist 上提交您的 Composer 软件包
要在 Packagist 上发布软件包,请提交包含描述软件包及其依赖关系的 composer.json 文件的 GitHub 仓库。单击 Packagist 网站上的 Submit,在出现的页面上提供您的 repo 的 URL,然后单击 Check 进行验证。
如果版本库有效,Packagist 就会检测到软件包的名称,”Check” 按钮就会变成 “Submit“。
Composer 软件包 rexfordnyrk/tempconv 已验证并准备提交。
单击 “Submit“,Packagist 会花一点时间设置并发布您的项目。
编译器软件包成功发布。
就是这样!您的软件包现在可以在 Packagist 上发布,供其他开发人员在自己的项目中作为依赖项使用。
在其他项目中使用您的 Composer 软件包
您可以在其他项目中使用您发布的软件包,方法是在 composer.json 文件中将其添加为依赖关系。您可以手动创建并编辑该文件,但最好使用 Composer 命令,如下所示:
$ composer require rexfordnyrk/tempconv
如果没有,Composer 会自动创建 composer.json 文件,然后从 Packagist 查找、下载并自动加载软件包。输出结果应该是这样的:
创建一个包含演示程序代码的 demo.php 文件,以便与程序库配合使用。然后,您可以在程序代码中使用 TemperatureConverter
类,如下所示:
<?php use Rexfordnyrk\Tempconv\TemperatureConverter; require_once './vendor/autoload.php'; $converter = new TemperatureConverter(); $fahrenheit = $converter->convert(20, 'C'); echo "20°C is equivalent to $fahrenheit °F\n"; $celsius = $converter->convert(68, 'F'); echo "68°F is equivalent to $celsius °C\n";
这段代码使用 TemperatureConverter
类转换 20 摄氏度和 68 华氏度的温度,并输出结果。Composer 创建了导入的 autoloader.php 文件,用于加载所需的所有依赖项。它会在必要时自动加载类。
最后,在终端运行这段代码:
$ php demo.php
输出结果应该与此类似:
$ php demo.php 20°C is equivalent to 68 °F 68°F is equivalent to 20 °C
小结
您刚刚在一个面向对象的类中创建了一个简单的 PHP 库,用于将摄氏温度转换为华氏温度,反之亦然,该库可以在其他应用程序中重复使用。您看到了如何使用 Composer Init 命令从类中创建包,还学到了一些库的基本代码组织最佳实践。您在 Packagist 上发布了库,这样您和其他开发人员就可以将其作为其他项目的依赖项。
评论留言