如何在 Ubuntu 20.04 上安装和使用 Composer

介绍

Composer是一个流行的 PHP 依赖管理工具,创建主要是为了方便项目依赖的安装和更新。它将检查特定项目依赖哪些其他包并为您安装它们,根据项目要求使用适当的版本。Composer 还常用于引导基于流行的 PHP 框架(例如SymfonyLaravel )的新项目

在本教程中,您将在 Ubuntu 20.04 系统上安装并开始使用 Composer。

先决条件

为了遵循本指南,您需要以非 rootsudo用户身份访问 Ubuntu 20.04 服务器,并在您的服务器上启用防火墙。要进行设置,您可以按照我们针对 Ubuntu 20.04 的初始服务器设置指南进行操作

第 1 步 – 安装 PHP 和其他依赖项

除了应该已经包含在 Ubuntu 20.04 系统中的依赖项(例如git和 )之外curl,Composer 还需要php-cli在命令行中执行 PHP 脚本并unzip提取压缩档案。我们现在将安装这些依赖项。

首先,通过运行更新包管理器缓存:

  • sudo apt update

接下来,运行以下命令来安装所需的包:

  • sudo apt install php-cli unzip

系统将提示您输入Y,然后输入确认安装ENTER

安装先决条件后,您可以继续安装 Composer。

步骤 2 — 下载和安装 Composer

Composer 提供了一个用 PHP 编写安装程序脚本。我们将下载它,验证它没有损坏,然后使用它来安装 Composer。

确保您位于主目录中,然后使用curl以下命令检索安装程序

  • cd ~
  • curl -sS https://getcomposer.org/installer -o composer-setup.php

接下来,我们将验证下载的安装程序是否与Composer 公钥/签名页面上找到的最新安装程序的 SHA-384 哈希匹配为了方便验证步骤,您可以使用以下命令以编程方式从 Composer 页面获取最新的哈希值并将其存储在 shell 变量中:

  • HASH=`curl -sS https://composer.github.io/installer.sig`

如果要验证获取的值,可以运行:

  • echo $HASH
Output
e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a

现在执行 Composer下载页面中提供的以下 PHP 代码,以验证安装脚本是否可以安全运行:

  • php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

您将看到以下输出:

输出
Installer verified

如果输出为Installer corrupt,则您需要再次下载安装脚本并仔细检查您使用的哈希值是否正确。然后,重复验证过程。当您拥有经过验证的安装程序时,您可以继续。

composer全局安装,请使用以下命令下载并安装 Composer 作为名为 的系统范围命令composer,位于/usr/local/bin

  • sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

你会看到类似这样的输出:

Output
All settings correct for using Composer Downloading... Composer (version 1.10.5) successfully installed to: /usr/local/bin/composer Use it: php /usr/local/bin/composer

要测试您的安装,请运行:

  • composer
Output
______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 1.10.5 2020-04-10 11:44:22 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --profile Display timing and memory usage information --no-plugins Whether to disable plugins. -d, --working-dir=WORKING-DIR If specified, use the given directory as working directory. --no-cache Prevent use of the cache -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug ...

这将验证 Composer 已成功安装在您的系统上并且在系统范围内可用。

注意:如果您希望为您在此服务器上托管的每个项目拥有单独的 Composer 可执行文件,您可以在每个项目的基础上在本地安装它。当您的系统用户无权在系统范围内安装软件时,此方法也很有用。

为此,请使用命令php composer-setup.php这将composer.phar在您的当前目录中生成一个文件,可以使用php composer.phar.

现在让我们看看使用 Composer 来管理依赖项。

第 3 步 – 在 PHP 项目中使用 Composer

PHP 项目通常依赖于外部库,管理这些依赖项及其版本可能很棘手。Composer 通过跟踪项目版本和依赖项解决了这个问题,同时也促进了查找、安装和更新项目所需的包的过程。

为了在您的项目中使用 Composer,您需要一个composer.json文件。composer.json文件告诉 Composer 它需要为您的项目下载哪些依赖项,以及允许安装每个包的哪些版本。这对于保持项目一致并避免安装可能导致向后兼容性问题的不稳定版本非常重要。

您不需要手动创建此文件 – 这样做时遇到语法错误是很常见的。Composer 提供了一种composer.json基于用户输入创建新文件的交互方式,如果您打算稍后在Packagist 上将项目作为公共包共享,这是一个不错的选择composer.json当您运行composer require命令以在新创建的项目中包含依赖项时,Composer 还会自动生成准系统文件

在项目中使用 Composer 安装包作为依赖的过程包括以下步骤:

  • 确定应用程序需要什么样的库。
  • Composer的官方包存储Packagist.org上研究合适的开源库
  • 选择您要依赖的包。
  • 运行composer require以在composer.json文件中包含依赖项并安装包。

让我们用一个演示应用程序来试试这个。

此应用程序的目标是将给定的句子转换为 URL 友好的字符串 – slug这通常用于将页面标题转换为 URL 路径(如本教程 URL 的最后部分)。

让我们首先为我们的项目创建一个目录。我们将其称为slugify

  • cd ~
  • mkdir slugify
  • cd slugify

虽然不是必需的,但您现在可以运行composer init命令composer.json为您的项目创建详细文件。因为我们项目的唯一目标是演示如何使用 Composer 安装依赖项,所以我们将使用一个更简单的composer.json文件,该文件将在我们需要第一个包时自动生成。

现在是时候在Packagist.org搜索可以帮助我们生成slugs的包了如果你在 Packagist 上搜索“slug”这个词,你会得到类似这样的结果:

术语“slug”的 Packagist 搜索结果

您将在列表中每个包裹的右侧看到两个数字。顶部的数字表示该软件包通过 Composer 安装的次数,底部的数字表示该软件包在 GitHub 上被加星标的次数。一般来说,安装次数多、星数多的包往往更稳定,因为有很多人在使用它们。检查包描述的相关性以确保它是您需要的也很重要。

我们需要一个string-to-slug转换器。从搜索结果来看cocur/slugify,出现在该页面第一个结果的包似乎是一个很好的匹配,具有合理的安装量和星级。

Packagist 上的软件包具有供应商名称和软件包名称。每个包都有一个唯一标识符(命名空间),格式与 GitHub 用于其存储库的格式相同:. 我们要安装的库使用 namespace 您需要一个包的命名空间才能在您的项目中使用它。vendor/packagecocur/slugify

现在您确切地知道要安装哪个包,您可以运行composer require以将其包含为依赖项,并composer.json为您的项目生成文件。在需要包时需要注意的一件事是 Composer 跟踪应用程序级依赖项以及系统级依赖项。系统级依赖关系对于指示包依赖哪些 PHP 模块很重要。cocur/slugify包而言,它需要一个我们尚未安装的 PHP 模块。

当所需的软件包依赖于当前未安装在您的服务器上的系统库时,您将收到一条错误消息,指出缺少哪个要求:

  • composer require cocur/slugify
Output
Using version ^4.0 for cocur/slugify ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Your requirements could not be resolved to an installable set of packages. Problem 1 - Installation request for cocur/slugify ^4.0 -> satisfiable by cocur/slugify[v4.0.0]. - cocur/slugify v4.0.0 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system. ...

为了解决系统依赖问题,我们可以使用apt search以下命令搜索丢失的包

  • apt search mbstring
Output
Sorting... Done Full Text Search... Done php-mbstring/focal 2:7.4+75 all MBSTRING module for PHP [default] php-patchwork-utf8/focal 1.3.1-1 all UTF-8 strings handling for PHP php7.4-mbstring/focal 7.4.3-4ubuntu1 amd64 MBSTRING module for PHP

找到正确的包名后,可以apt再次使用安装系统依赖:

  • sudo apt install php-mbstring

安装完成后,您可以composer require再次运行命令:

  • composer require cocur/slugify
Output
Using version ^4.0 for cocur/slugify ./composer.json has been created Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing cocur/slugify (v4.0.0): Downloading (100%) Writing lock file Generating autoload files

从输出中可以看出,Composer 自动决定使用哪个版本的包。如果您现在检查项目的目录,它将包含两个新文件:composer.jsoncomposer.lock,以及一个vendor目录:

  • ls -l
Output
total 12 -rw-rw-r-- 1 sammy sammy 59 May 4 13:56 composer.json -rw-rw-r-- 1 sammy sammy 3229 May 4 13:56 composer.lock drwxrwxr-x 4 sammy sammy 4096 May 4 13:56 vendor

composer.lock文件用于存储有关安装每个包的版本的信息,并确保在其他人克隆您的项目并安装其依赖项时使用相同的版本。vendor目录是项目依赖项所在的位置。vendor文件夹不应提交到版本控制中 – 您只需要包含composer.jsoncomposer.lock文件。

安装已包含composer.json文件的项目时,运行composer install以下载项目的依赖项。

让我们快速浏览一下版本约束。如果您检查composer.json文件的内容,您会看到如下内容:

  • cat composer.json
Output
{ "require": { "cocur/slugify": "^4.0" } }

您可能会注意到的特殊字符^中的版本号之前composer.jsonComposer 支持多种不同的约束和格式来定义所需的包版本,以提供灵活性,同时保持您的项目稳定。^自动生成的composer.json文件使用的 caret ( ) 运算符是推荐的运算符,以实现最大的互操作性,遵循语义版本控制在这种情况下,它将4.0定义为最低兼容版本,并允许更新到任何低于5.0 的未来版本

一般来说,您不需要篡改composer.json文件中的版本约束但是,某些情况可能需要您手动编辑约束——例如,当您需要的库的主要新版本发布并且您想要升级时,或者当您想要使用的库不遵循语义版本控制时。

以下是一些示例,可让您更好地了解 Composer 版本约束的工作原理:

约束 意义 允许的示例版本
^1.0 >= 1.0 < 2.0 1.0、1.2.3、1.9.9
^1.1.0 >= 1.1.0 < 2.0 1.1.0、1.5.6、1.9.9
~1.0 >= 1.0 < 2.0.0 1.0、1.4.1、1.9.9
~1.0.0 >= 1.0.0 < 1.1 1.0.0、1.0.4、1.0.9
1.2.1 1.2.1 1.2.1
1.* >= 1.0 < 2.0 1.0.0、1.4.5、1.9.9
1.2.* >= 1.2 < 1.3 1.2.0、1.2.3、1.2.9

如需更深入地了解 Composer 版本限制,请参阅官方文档

接下来,我们来看看如何使用 Composer 自动加载依赖项。

第 4 步 – 包括自动加载脚本

由于 PHP 本身不会自动加载类,Composer 提供了一个自动加载脚本,您可以将其包含在您的项目中以使自动加载为您的项目工作。当您添加第一个依赖项时,该文件由 Composer 自动生成。

您唯一需要做的就是vendor/autoload.php在任何类实例化之前文件包含在您的 PHP 脚本中。

让我们在演示应用程序中尝试一下。打开一个test.php在文本编辑器中调用的新文件

  • nano test.php

添加以下代码以引入vendor/autoload.php文件,加载 cocur/slugify依赖项,并使用它来创建一个 slug:

测试文件
<?php
require __DIR__ . '/vendor/autoload.php';

use Cocur\Slugify\Slugify;

$slugify = new Slugify();

echo $slugify->slugify('Hello World, this is a long sentence and I need to make a slug from it!');

保存文件并退出编辑器。

现在运行脚本:

  • php test.php

这会产生输出hello-world-this-is-a-long-sentence-and-i-need-to-make-a-slug-from-it

当新版本出现时,依赖项需要更新,所以让我们看看如何处理。

第 5 步 – 更新项目依赖项

每当您想将项目依赖项更新到最新版本时,请运行以下update命令:

  • composer update

这将检查您在项目中所需的库的较新版本。如果找到更新的版本并且它与composer.json文件中定义的版本约束兼容,Composer 将替换之前安装的版本。composer.lock文件将更新以反映这些更改。

您还可以通过如下指定来更新一个或多个特定库:

  • composer update vendor/package vendor2/package2

更新依赖项后,请务必检查版本控制系统中的composer.jsoncomposer.lock文件,以便其他人也可以安装这些较新版本。

结论

Composer 是一个强大的工具,可以极大地促进 PHP 项目中管理依赖项的工作。它提供了一种可靠的方式来发现、安装和更新项目所依赖的 PHP 包。在本指南中,我们了解了如何安装 Composer,如何在项目中包含新的依赖项,以及如何在新版本可用后更新这些依赖项。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁