composer global require
のより安全な代替手段を提供します。
Cgr は数年前から現実の環境で使用されています。ただし、発行キューと以下の「制限事項」を参照してください。
Composer のglobal require
コマンドは、多くの PHP コマンドライン ツールで推奨されるインストール手法です。ただし、この方法でツールをインストールするユーザーは、異なるプロジェクト間の依存関係の競合によってインストールが失敗する危険があります。 cgr スクリプトは、 composer global require
と同様に動作します。composer composer require
を使用して、コマンドライン ツールのユーザーごとのグローバル コピーをインストールしますが、グローバルにインストールされている他のツールとの依存関係の競合が発生しない隔離された場所にインストールされます。
cgr スクリプトはセキュリティとは無関係です。これは、composer global require を介してインストールすることと同じか、それよりも安全ではありません。
Composer 自体は、コマンドライン ツールをインストールするための「便利な」コマンドとして、 composer global require
推奨しています。残念ながら、この推奨事項は、すべてのプロジェクトの依存関係は独立して管理されるべきであるという Composer の基本的な前提と矛盾します。 Composer global
コマンドは、単一の「グローバル」プロジェクトを作成します。 composer global require
を介してインストールされたプロジェクトはすべてこの場所にインストールされ、それらの依存関係はすべてマージされます。これは、連携して動作するように設計されておらず、依存関係を 1 つのオートローダーに結合する必要がない 2 つの独立したプロジェクト間で競合が発生する可能性があることを意味します。このような状況が発生した場合、初心者にとって診断するのは非常に難しいことがよくあります。
このスクリプトはcgr
と呼ばれ、エミュレートする Composer コマンドである「composer global require」にちなんで名付けられています。これは、既存のコマンドと機能的に (ほぼ) 同等でありながら、より安全な PHP コマンドライン ツールをグローバルにインストールするための代替メカニズムを提供します。 Cgr スクリプトは、インストールされているプロジェクトごとに個別のディレクトリを作成します。デフォルトでは、インストール場所は~/.composer/global/org/project
です。インストールされたプロジェクトの combos.json ファイルにリストされているバイナリ スクリプトは、標準の Composer bin ディレクトリ~/.composer/vendor/bin
にインストールされます。
cgr スクリプトにはそれ自体の依存関係がないため、Composer のglobal require
コマンドを使用して安全にインストールできます。
composer global require consolidation/cgr
まだ行っていない場合は、Composer ホーム ディレクトリのvendor/bin
$PATH に追加する必要もあります。その後、インストール手順で Composer global require
の使用を推奨しているコマンドライン ツールをcgr
に置き換えることができます。
正しい 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_PATH | Composer バイナリへのパス。 |
--ベースディレクトリ | CGR_BASE_DIR | 「グローバル」プロジェクトを保存する場所。 |
--bin-dir | CGR_BIN_DIR | プロジェクトバイナリをインストールする場所。 |
これらの変数が定義されていない場合、環境変数に関する Composer ドキュメントの説明に従って、cgr はCOMPOSER_HOME
環境変数の値を使用するベース ディレクトリとして使用します。
バイナリを ~/bin にインストールするように cgr を設定するには、~/.bashrc ファイルに以下を追加します。
export CGR_BIN_DIR=$HOME/bin
$PATH 内にある限り、 CGR_BIN_DIR
として任意のディレクトリを選択できます。
プロジェクトの情報を表示するには、次を実行します。
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 プラグインもグローバル コンテキストで使用できなくなります。
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 の問題を参照してください。