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

安装数: 206,834

依赖: 0

建议者: 2

安全: 0

星级: 451

关注者: 14

分支: 24

开放问题: 10

类型:项目

2.0.6 2024-05-03 21:12 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_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/cgrcomposer global remove cgr。请注意,删除cgr不会影响您使用cgr安装的命令;它们将保持安装和可用。

故障排除

如果您发现cgr仍然像标准的Composer global require命令一样运行,请再次检查您的$PATH变量的设置,并使用which cgralias 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

如果您选择此方法,您需要手动设置安装位置,使用mkdircd等命令,然后在运行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问题获取最新更新。