如何在Ubuntu22.04上安装和使用Composer

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

先决条件

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

如果您希望在浏览器中使用终端来学习本教程,请单击 Launch an Interactive Terminal! 按钮开始使用。 您将能够直接在浏览器中试验和运行所有命令。

启动交互式终端!

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

除了应该已经包含在 Ubuntu 22.04 系统中的依赖项,例如 gitcurl,Composer 需要 php-cli 才能在命令行中执行 PHP 脚本,和 unzip 提取压缩档案。 我们现在将安装这些依赖项。

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

sudo apt update

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

sudo apt install php-cli unzip

系统将提示您通过键入 Y 然后 ENTER 来确认安装。

安装必备组件后,您可以继续安装 Composer。

第 2 步 — 下载并安装 Composer

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

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

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

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

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

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

echo $HASH
Output906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8

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

php -r "if (hash_file('SHA384', '/tmp/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 /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

您将看到与此类似的输出:

OutputAll settings correct for using Composer
Downloading...

Composer (version 2.3.5) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer

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

composer
Output   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.3.5 2022-04-13 16:43:00

Usage:
  command [options] [arguments]

Options:
  -h, --help                     Display help for the given command. When no command is given display help for the list command
  -q, --quiet                    Do not output any message
  -V, --version                  Display this application version
      --ansi|--no-ansi           Force (or disable --no-ansi) ANSI output
  -n, --no-interaction           Do not ask any interactive question
      --profile                  Display timing and memory usage information
      --no-plugins               Whether to disable plugins.
      --no-scripts               Skips the execution of all scripts defined in composer.json file.
  -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 /tmp/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 require 命令以在新创建的项目中包含依赖项时,Composer 还会自动生成准系统 composer.json 文件。

在项目中使用 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”这个词,你会得到类似这样的结果:

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

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

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

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

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

composer require cocur/slugify:4.1
Output./composer.json has been created
Running composer update cocur/slugify
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires cocur/slugify 4.1 -> satisfiable by cocur/slugify[v4.1.0].
    - cocur/slugify v4.1.0 requires ext-mbstring * -> it is missing from your system. Install or enable PHP's mbstring extension.
...

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

apt search mbstring
OutputSorting... Done
Full Text Search... Done
php-mbstring/jammy 2:8.1+92ubuntu1 all
  MBSTRING module for PHP [default]

php-symfony-polyfill-mbstring/jammy 1.24.0-1ubuntu2 all
  Symfony polyfill for the Mbstring extension

php8.1-mbstring/jammy 8.1.2-1ubuntu2 amd64
  MBSTRING module for PHP

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

sudo apt install php-mbstring

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

composer require cocur/slugify
OutputUsing version ^4.1 for cocur/slugify
./composer.json has been created
Running composer update cocur/slugify
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking cocur/slugify (v4.1.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing cocur/slugify (v4.1.0): Extracting archive
Generating autoload files

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

ls -l
Outputtotal 12
-rw-r--r-- 1 sammy sammy   59 Apr 18 14:17 composer.json
-rw-r--r-- 1 sammy sammy 3462 Apr 18 14:17 composer.lock
drwxr-xr-x 4 sammy sammy 4096 Apr 18 14:17 vendor

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

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


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

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

您可能会注意到 composer.json 中版本号之前的特殊字符 ^。 Composer 支持多种不同的约束和格式来定义所需的包版本,以便在提供灵活性的同时保持项目的稳定性。 自动生成的 composer.json 文件使用的插入符号 (^) 运算符是推荐的运算符,以实现最大的互操作性,遵循 语义版本控制 。 在这种情况下,它将 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 版本约束见【X62X】官方文档【X92X】。

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

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

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

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

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

nano test.php

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

测试.php

<?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

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

第五步——更新项目依赖

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

composer update

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

您还可以通过像这样指定它们来更新一个或多个特定库:

composer update vendor/package vendor2/package2

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

结论

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