一些PHP库在通过作曲家安装后可以使用。
这是什么意思?
这是使用这些库的唯一方法,还是有办法使用它们将代码复制到正确的位置并在代码中引用它们?
例子: mPDF 可以(仅?)通过作曲家使用 https://mpdf.github.io/
PHPMailer可以只使用在正确的位置复制文件并引用它们 https://github.com/PHPMailer/PHPMailer
库的事情是,它们可能需要其他库,而这些库可能需要其他库等等。因此,下载它们并将它们放在某个位置将很乏味,当两个库需要不同版本的相同库时,您会遇到问题。Composer 将通过确定需要哪些库来满足所有要求来为您解决此问题,并确保下载适合所有要求的版本,或者引发当前库集合包含不兼容库以及哪些库的错误。
另一个问题是找到存储这些库的正确位置,因为 PHP 必须弄清楚每个类的存储位置,您必须在代码和库中添加require
/include
语句,这很乏味,并且会使未来的更新复杂化,例如当类被重命名或删除时。解决此问题的一种方法是拥有一个共享的 lib 目录,但是当您有多个项目需要不同的库版本时,您会遇到问题。
对于库来说,作曲家是事实上的标准,您将始终需要/想要使用它在您的项目中安装库。它负责解决正确的版本,自动加载和更新,使其非常有用,特别是如果你还在作曲家的时候。即使我不需要库只是为了自动加载和以后在我的项目增长/更改时添加库的能力,我也会使用它。
编辑:即使PHPMailer也提供了一个composer.json,即使它不需要其他库,但是如果你通过composer安装它,你可以确保你的系统满足要求(PHP版本和安装的扩展),否则你可能会错过,导致可能很长的调试会话找出为什么某些功能不起作用。
编辑您也可以将作曲家用于共享主机上的项目。然后,您必须在本地计算机或为实际服务器生成服务器上运行该命令,而不是在服务器上运行该命令。您可以将包括供应商文件夹在内的项目复制到共享主机,一切应该可以正常工作。供应商文件夹包含所有库和autoload.php
,可以与您的代码一起复制。
为了可靠地做到这一点,在 composer.json 的 config 下,您可以指定将在其上运行代码的平台。您至少应该定义正确的 PHP 版本,但也应该定义已安装的扩展,以确保您不会意外地在没有所需扩展的地方安装库。当您运行composer install
或composer update
时,它将使用这些平台详细信息作为下载与其匹配的库的基础。当您安装了 PHP 7 但您的主机尚未安装它时,这一点尤其重要。
当在与使用代码的服务器不同的服务器上运行 composer 时,一些选项不会像--apcu-autoloader
那样工作,但您可能无论如何都不会使用它们。
如果在本地计算机上运行 composer 并复制内容,可以通过向 composer 安装添加一些选项来稍微改善体验:
composer install --no-dev --prefer-dist --classmap-authoritative
您可以在文档中获取有关这些选项的详细信息。重要的是:
--no-dev
,可能会将下载的库数量减少到生产所需的库数量(因为我们只想在服务器上运行项目而不是在其上开发)。--prefer-dist
(为什么在文档中解释)--classmap-authoritative
或--optimize-autoloader
,(第一个可能不适用于某些项目/库),但它将改进自动加载,使您的应用程序在生产中速度稍快
一点
前 2 个选项,如果您复制开发环境,则不应运行,因为它们不会为开发提供所有依赖项。也许设置第二个项目,仅用于从 git 中签出最新更改,运行测试以确保一切正常,然后删除供应商并运行该命令(可能对 prod 的配置进行一些更改),最后将内容复制到您的共享托管环境。如果你使用像 gitlab 这样提供 CI 功能的东西,你也可以在 ci 服务器上执行这些步骤并让它复制东西,但设置需要一些时间。