consolidation / 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-03 21:54:00 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
命名。它提供了一个安装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_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
来确认是否选择了此脚本。cgr可能与某些其他工具冲突;例如,oh-my-zsh项目定义了一个cgr别名。如果您遇到此问题,可以选择unalias cgr
,或者添加alias cgrx="$HOME/.composer/vendor/bin/cgr"
来以cgrx
运行此实验性工具。
限制
Composer还会从“全局”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问题获取最新更新。