为composer global require
提供更安全的替代方案。
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 全局 require 命令不同,可以使用 cgr 在安装项目之前设置项目的最低稳定性。这与composer create-project
命令的执行方式相同:
cgr --stability RC pantheon-systems/terminus 1.0.0-alpha2
可以使用命令行选项和环境变量自定义 cgr 脚本的行为。
选项 | 环境变量 | 描述 |
---|---|---|
--作曲家路径 | CGR_COMPOSER_PATH | Composer 二进制文件的路径。 |
--基目录 | CGR_BASE_DIR | 在哪里存储“全局”项目。 |
--bin目录 | CGR_BIN_DIR | 在哪里安装项目二进制文件。 |
如果未定义这些变量,则 cgr 将使用COMPOSER_HOME
环境变量的值作为要使用的基目录,如 Composer 文档中有关环境变量的描述。
要将 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/cgr
或composer global remove cgr
。请注意,删除 cgr 对您使用 cgr 安装的命令没有影响;它们将保持安装状态并正常运行。
如果您发现cgr
行为仍然像标准 Composer global require
命令,请仔细检查 $PATH 变量的设置,并使用which cgr
和alias cgr
来确定您的 shell 是否选择了该脚本。 cgr 可能会与其他工具发生冲突;例如,oh-my-zsh 项目定义了一个 cgr 别名。如果这对您来说是一个问题,请使用unalias cgr
,或者添加alias cgrx="$HOME/.composer/vendor/bin/cgr"
来运行此实验工具作为cgrx
。
Composer 还将从“全局”Composer 项目加载 Composer 插件。这种情况很少见;但是,如果您想全局安装 Composer 安装程序,则必须直接使用composer global require
命令。 cgr脚本将其安装的项目相互隔离,以避免依赖项之间潜在的冲突;这种隔离还使得任何 Composer 插件在全局上下文中不可用。
cgr脚本为您维护了自动管理全局安装位置的便利;但是,如果不需要这样做,您可以简单地运行类似于以下的命令:
COMPOSER_BIN_DIR=$HOME/bin composer require org/project:~1.0
如果您选择此路线,则需要在运行composer require
之前根据需要使用mkdir
和cd
手动设置安装位置。您不能简单地全局设置 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 插件 bamarni/composer-bin-plugin 提供了一种类似的方法,通过定义单独的命名安装位置来管理二进制工具的独立安装。这提供了一种将多个项目安装在一起的便捷方法(例如,安装 Robo 以及在“robo”项目中提供附加 Robo 任务的外部项目)。
希望这个工具将成为一个临时解决方案,直到 Composer 的更改使其变得不必要为止。请参阅 Composer 问题以获取更新。