目录
正确安装全局 Composer 包
该工具不应该/不能做什么?
接下来是什么?
关于 Composer 全局 Require 的常见问题
为什么使用 Composer 的全局 require 被认为是有害的?
Composer 全局 require 的替代方案是什么?
cgr 如何帮助避免全局依赖问题?
如何安装和使用 cgr?
Composer 中本地安装和全局安装有什么区别?
如何在 Composer 中管理全局依赖项?
我可以在 Composer 中同时使用本地安装和全局安装吗?
不正确管理 Composer 中的依赖项有哪些风险?
如何解决 Composer 中的依赖冲突?
如何保持 Composer 依赖项的最新状态?
首页 后端开发 php教程 作曲家全球需要被认为有害吗?

作曲家全球需要被认为有害吗?

Feb 15, 2025 pm 01:24 PM

Composer Global Require Considered Harmful?

关键要点

  • 除非全局安装的包没有依赖项,否则将 composer global require 用于安装跨多个项目使用的包现在被许多人认为是不好的做法。这是因为当包共享相同的空间时,可能会发生依赖冲突。
  • 另一种解决方案是使用 composer require 将每个命令行工具安装到其自己的本地项目中,手动管理 $PATH 或二进制文件。但是,这可能会增加复杂性和乏味性。对全局命令的建议更改可能会看到一个“全局的”但隔离的项目安装到特定位置,其供应商和 bin 目录出现在它们通常的位置。
  • 一个新的工具 cgr (Composer Global Require) 已经被开发出来作为全局实现的替代方案。它为每个包创建隔离的安装,避免全局依赖问题。但是,此工具仍处于概念验证阶段,可能会发生更改。建议对其进行测试,但此时不要过度依赖它。

我们之前讨论过 Composer 的最佳实践,我一直提倡在安装可在多个项目中使用的包(特别是命令行工具)时使用 composer global require。然后,有一天,我遇到了这个讨论。

Composer Global Require Considered Harmful?

简而言之,现在大多数人似乎觉得全局 require 是不好的做法,除非全局安装的包没有依赖项。从技术上讲,当一个人对所有项目使用单个环境时,这是有意义的,但正如我在该讨论中评论的那样,当每个项目使用虚拟机或像 Docker 这样的适当隔离的环境时,这个问题就无关紧要了,全局实际上不会造成损害。

OP 对此问题的建议解决方案是:

作为替代方案,用户应该使用 composer require 将每个命令行工具安装到其自己的本地项目中,并手动管理其 $PATH 或二进制文件(例如,通过从 $PATH 中已有的 bin 目录创建符号链接)。

对我来说,这是一个完全不可接受的复杂化。Composer 一直是 PHP 的骄傲,因为它易于使用,并且使包管理变得对新手友好——本地 全局。必须四处创建符号链接(尤其要考虑到像 Windows 这样的非符号链接操作系统)会增加乏味感。然后,OP 进一步建议更改全局命令的工作方式:

可以将一个“全局的”但隔离的项目安装到 ~/.composer/global/[something];其供应商和 bin 目录将出现在它们通常的位置,并且 ~/.composer/global/[something]/bin 目录的内容可以在 ~/.composer/vendor/bin 中镜像(通过符号链接),或者更好的选择可能是 ~/.composer/bin。字符串 [something] 可以通过多种方式选择;最直接的方法是 org/project(尽管这意味着将存在像 ~/.composer/global/org/project/vendor/org/project 这样的长路径)。

我完全同意这种方法,它似乎是两全其美的。显然,这可能会导致一些向后兼容性问题,但这并不意味着它不能在 Composer 的 2.0 版本中发生。Taylor Otwell 在下面进一步回应了这种观点:

完全同意。能够将每个 composer 全局安装的包安装到其自己的隔离目录中,并拥有其自己的隔离依赖项,而不是可能与其他全局安装的包冲突,这将是令人惊奇的。

在此之后,本着真正的开源精神,OP 随后将替代全局实现构建为一个单独的工具:cgr。让我们看看它是如何工作的。

CGR – Composer 全局 Require 替代方案

我将在 Homestead Improved 实例上执行以下所有命令

要开始使用 CGR,我们将其作为全局包安装。

composer global require consolidation/cgr
登录后复制
登录后复制

如果 Composer 的 bin 文件夹不在 PATH 变量中,请添加它:

echo "export PATH=$PATH:$HOME/.composer/vendor/bin/" >> ~/.bashrc
echo "export CGR_BIN_DIR=$HOME/.composer/vendor/bin" >> ~/.bashrc
source ~/.bashrc
登录后复制

以上命令使用 Composer 的全局 bin 目录的路径扩展 $PATH 环境变量(Homestead Improved 上的默认位置——你的位置可能不同)。第二个命令配置 cgr 使用的 bin 目录,而第三个命令加载这些更改。这些也将在每次以该用户身份运行终端界面时自动加载(在我的情况下,通过 vagrant ssh 使用 Vagrant)。

然后可以通过运行 cgr 来访问 CGR,它应该输出 Composer 的一般帮助文件。

正确安装全局 Composer 包

cgr phpunit/phpunit
登录后复制

在 Homestead Improved 上,配置了一个有用的别名,在其中键入 phpunit 会扩展为 vendor/bin/phpunit,这在每个项目安装 phpunit 时非常方便,因此可以从根文件夹运行它。为了测试 PhpUnit 的全局安装,我们需要先删除此别名(在 ~/.bash_aliases 中注释相应的行),然后退出 shell 并重新进入,以便别名重新加载。然后,使用版本输出运行这个新全局安装的 PhpUnit 应该产生类似以下内容:

vagrant@homestead:~$ phpunit --version
PHPUnit 5.4.2 by Sebastian Bergmann and contributors.
登录后复制

现在让我们尝试安装两个不兼容的包。

cgr laravel/installer
cgr wp-cli/wp-cli
登录后复制

当然,它们都可以正常安装。让我们检查它们是否有效。

composer global require consolidation/cgr
登录后复制
登录后复制

一切顺利!以前由于依赖项不匹配而发生冲突的全局包现在可以并排共存,并且可以在整个操作系统中使用,而不会出现任何问题!

该工具不应该/不能做什么?

在某些情况下,您可能希望安装 Composer 插件。如限制部分所述,由于 CGR 将每个全局包安装到其自己的文件夹中并拥有其自己的依赖项树,因此这些插件不会在所有全局项目中全局可用。因此,如果您想安装更改 composer 通用行为的插件,您仍然应该使用 composer global require 而不是 cgr。例如,CGR 本身就是这样一个插件。

接下来是什么?

测试,测试,测试!如果您是全局 require 命令的常用用户,我强烈建议您测试这个新工具,并向 Greg Anderson 提供一些反馈,说明它在多大程度上满足了您的全局需求,以及是否有任何改进之处。

请注意,此工具目前只是一个概念验证,实现方式可能会或可能不会重命名、重新打包、最终集成到 Composer 的核心等等。换句话说,尽可能多地使用它,但暂时不要过度依赖它。

在您的全局包安装的同时,为什么不告诉我们您对 composer global require 的看法呢?它像许多人现在认为的那样有害吗?还是仅仅是谨慎行事和拥有隔离的开发环境的问题?其他什么?请在下面发表您的意见!

关于 Composer 全局 Require 的常见问题

为什么使用 Composer 的全局 require 被认为是有害的?

Composer 的全局 require 被认为是有害的,因为它可能导致依赖冲突。当您全局安装包时,它们都共享相同的空间,这意味着它们共享相同的依赖项集。如果两个包需要不同版本的相同依赖项,则可能导致冲突和错误。建议为每个项目安装其自己的一组依赖项,以避免此类问题。

Composer 全局 require 的替代方案是什么?

不要使用 Composer 的全局 require,您可以为每个需要的工具创建一个新的 Composer 项目。这样,每个工具将拥有自己的一组依赖项,从而降低冲突的风险。您还可以使用 cgr 等工具,它为每个包创建隔离的安装,从而避免全局依赖问题。

cgr 如何帮助避免全局依赖问题?

CGR(Composer 全局 Require)是一个为每个包创建隔离安装的工具。这意味着每个包及其依赖项都安装在其自己的单独目录中,避免了不同包的依赖项之间发生冲突的风险。这使其成为使用 Composer 全局 require 的更安全替代方案。

如何安装和使用 cgr?

要安装 cgr,您可以使用命令 composer global require consolidation/cgr。安装后,您可以像使用 Composer 的全局 require 一样使用 cgr。例如,要安装包,您可以使用命令 cgr require package-name

Composer 中本地安装和全局安装有什么区别?

在 Composer 中,本地安装意味着包及其依赖项安装在项目的目录中。这是安装包的推荐方法,因为它可以避免依赖冲突。另一方面,全局安装将包及其依赖项安装在全局目录中,如果不同的包需要不同版本的相同依赖项,则可能导致冲突。

如何在 Composer 中管理全局依赖项?

由于存在冲突的风险,在 Composer 中管理全局依赖项可能具有挑战性。但是,像 cgr 这样的工具可以通过为每个包创建隔离的安装来提供帮助。您还可以通过为每个需要的工具创建一个新的 Composer 项目来管理全局依赖项,确保每个工具都拥有自己的一组依赖项。

我可以在 Composer 中同时使用本地安装和全局安装吗?

是的,您可以在 Composer 中同时使用本地安装和全局安装。但是,建议尽可能使用本地安装以避免依赖冲突。如果您需要全局使用包,请考虑使用 cgr 等工具来创建隔离的安装。

不正确管理 Composer 中的依赖项有哪些风险?

不正确管理 Composer 中的依赖项可能导致冲突和错误。如果两个包需要不同版本的相同依赖项,则可能会导致难以调试的问题。它还可能导致应用程序出现意外行为,因为不同版本的依赖项可能具有不同的功能和行为。

如何解决 Composer 中的依赖冲突?

要解决 Composer 中的依赖冲突,您可以尝试将包更新到最新版本,因为这可能会解决冲突。如果这不起作用,您可能需要重新考虑您正在使用的包并找到没有冲突依赖项的替代方案。像 cgr 这样的工具也可以通过为每个包创建隔离的安装来提供帮助。

如何保持 Composer 依赖项的最新状态?

要保持 Composer 依赖项的最新状态,您可以使用 composer update 命令。这会根据 composer.json 文件中指定的版本约束将所有包更新到其最新版本。您还可以使用 composer outdated 命令查看哪些包有可用的较新版本。

以上是作曲家全球需要被认为有害吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP 8.1中的枚举(枚举)是什么? PHP 8.1中的枚举(枚举)是什么? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

如何用PHP的cURL库发送包含JSON数据的POST请求? 如何用PHP的cURL库发送包含JSON数据的POST请求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

See all articles