yoeunes / cgr
比 'composer global require' 更安全的替代品。
Requires
- php: ^5.3.2 || ^7.0 || ^8.0
Requires (Dev)
- php-coveralls/php-coveralls: ~2.4
- phpunit/phpunit: ~4.8
- squizlabs/php_codesniffer: ~3.6
This package is auto-updated.
Last update: 2024-09-10 16:57:50 UTC
README
提供一个比 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
命名的。它提供了一个功能上相当于现有命令(几乎是)的替代机制,但更安全。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_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 还会从 "global" Composer 项目加载 Composer 插件。这很少见;然而,如果您想全局安装 Composer 安装器,则必须直接使用 composer global require
命令。cgr 脚本将其安装的项目彼此隔离,以避免潜在的依赖项冲突;这种隔离也使得任何 Composer 插件在全局上下文中不可用。
替代方案
手动使用原生 Composer 功能
cgr 脚本保留了自动为您管理全局安装位置的便利性;然而,如果您不希望这样做,您可以简单地运行类似以下命令
COMPOSER_BIN_DIR=$HOME/bin composer require org/project:~1.0
如果您选择此方案,您需要手动设置安装位置,使用 mkdir
和 cd
(如有必要)在运行 composer require
之前进行设置。您不能全局设置 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 问题 了解更新。