rluna / cgr
比 'composer global require' 更安全的替代方案。
Requires
- php: ^7.0 || ^8.0
Requires (Dev)
- phpunit/phpunit: 4.*
- satooshi/php-coveralls: ^1.0
- squizlabs/php_codesniffer: 2.*
This package is auto-updated.
Last update: 2024-09-20 14:05:45 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
来确定此脚本是否被您的 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 插件在全局上下文中不可用。
替代方案
手动使用原生 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 问题 以获取更新。