比 'composer global require' 更安全的替代品。

2.0.5 2018-10-03 17:46 UTC

README

提供对 composer global require 的更安全替代方案。

Build Status Scrutinizer Code Quality Coverage Status License

组件状态

Cgr已在实际环境中使用了几个月,没有报告任何问题;然而,请参阅下方的'限制'。

动机

Composer global require 命令是许多PHP命令行工具推荐安装技术;然而,以这种方式安装工具的用户可能会遇到由不同项目之间的依赖冲突引起的安装失败。cgr脚本的行为与composer global require相似,使用composer require安装一个全局用户级命令行工具的副本,但位于一个隔离的位置,不会与其他全局安装的工具发生依赖冲突。

cgr脚本与安全无关;它并不比通过composer global require安装更安全或更不安全。

Composer本身推荐composer global require作为安装命令行工具的"方便"命令。不幸的是,这个建议与Composer的基本假设相矛盾,即每个项目的依赖都应该独立管理。《Composer global》命令创建了一个单独的"全局"项目;通过composer global require安装的项目都将安装在这个位置,并且它们的依赖都将合并。这意味着两个独立的项目之间可能会出现冲突,这些项目从未设计成可以一起工作,也不需要将它们的依赖合并到一个单个的自动加载器中。当这种情况发生时,对于初学者来说通常很难诊断。

这个名为cgr的脚本,以它模拟的Composer命令composer global require命名。它提供了一个安装PHP命令行工具的全局替代机制,功能上与现有命令几乎相同,但更安全。Cgr脚本将为每个安装的项目创建一个单独的目录;默认安装位置是~/.composer/global/org/project。在安装项目的composer.json文件中列出的任何二进制脚本都将安装到标准的Composer bin目录~/.composer/vendor/bin中。

安装和使用

因为cgr脚本没有自己的依赖项,所以可以通过Composer global require命令安全地安装

composer global require consolidation/cgr

如果您还没有这样做,您还需要将Composer主目录中的vendor/bin添加到您的$PATH中。之后,您可以用cgr替换任何建议使用Composer global require安装命令行工具的命令。

要将正确的bin目录添加到您的PATH中

PATH="$(composer config -g home)/vendor/bin:$PATH"

示例

cgr drush/drush

与composer global require命令不同,使用cgr可以在安装项目之前设置项目的最低稳定性。这与composer create-project命令的用法相同

cgr --stability RC pantheon-systems/terminus 1.0.0-alpha2

可以使用命令行选项和环境变量自定义cgr脚本的行为。

如果这些变量没有定义,则cgr使用Composer文档中的环境变量中描述的COMPOSER_HOME环境变量的值作为基本目录。

要将cgr配置为将二进制文件安装到~/bin,请将以下内容添加到您的~/.bashrc文件中

export CGR_BIN_DIR=$HOME/bin

您可以选择任何喜欢的目录作为 CGR_BIN_DIR,只要它在您的 $PATH 中。

显示信息

要显示项目的信息,请运行

cgr info drush/drush

要显示通过 'cgr' 安装的项目的所有信息,请运行

cgr info

更新和删除

要更新您使用 cgr 安装的某个项目,请运行

cgr update drush/drush

要更新由 cgr 安装的所有内容,请运行

cgr update

要删除项目

cgr remove drush/drush

要更新或删除 cgr 本身,请运行 composer global update consolidation/cgrcomposer global remove cgr。请注意,删除 cgr 不会影响您使用 cgr 安装的命令;它们将保持安装并可用。

故障排除

如果您发现 cgr 仍然像标准的 Composer global require 命令一样运行,请检查您的 $PATH 变量的设置,并使用 which cgralias cgr 来确定该脚本是否被您的 shell 选择。cgr 可能与其他工具冲突;例如,oh-my-zsh 项目定义了一个 cgr 别名。如果这是您的问题,可以执行 unalias cgr,或者可能需要添加 alias cgrx="$HOME/.composer/vendor/bin/cgr" 来以 cgrx 运行此实验性工具。

限制

Composer 还会从 "global" Composer 项目加载 Composer 插件。这种情况很少见;但是,如果您想全局安装 Composer 安装程序,则必须直接使用 composer global require 命令。cgr 脚本将安装的项目彼此隔离,以避免潜在的依赖项冲突;这种隔离还使得任何 Composer 插件在全局上下文中不可用。

替代方案

手动使用原生 Composer 功能

cgr 脚本保留了自动管理全局安装位置的便利性;但是,如果您不希望这样做,可以运行类似以下命令的命令

COMPOSER_BIN_DIR=$HOME/bin composer require org/project:~1.0

如果您选择此方案,您将需要手动设置安装位置,在运行 composer require 之前使用 mkdircd。您不能全局设置 COMPOSER_BIN_DIR,因为这样做会导致本地项目的二进制文件安装到您的全局 bin 目录中,这当然是不希望的。

在持续集成脚本中,以下结构很有用

/usr/bin/env COMPOSER_BIN_DIR=$HOME/bin composer --working-dir=$HOME/project require org/project:~1.0

更改安装目录($HOME/project),以匹配要安装的项目,这样每个项目都将在其单独的位置安装。

Composer Bin 插件

Composer 插件 bamarni/composer-bin-plugin 提供了一种类似的方法来通过定义单独命名的安装位置来管理二进制工具的独立安装。这为一起安装多个项目提供了一种方便的方法(例如,在 'robo' 项目中安装 Robo 以及提供额外 Robo 任务的第三方项目)。

未来开发

希望这个工具将是一个临时解决方案,直到 Composer 的变化使其变得不再必要。有关更新,请参阅 Composer 问题