為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 全域 require 指令不同,可以使用 cgr 在安裝專案之前設定專案的最低穩定性。這與composer create-project
命令的執行方式相同:
cgr --stability RC pantheon-systems/terminus 1.0.0-alpha2
可以使用命令列選項和環境變數自訂 cgr 腳本的行為。
選項 | 環境變數 | 描述 |
---|---|---|
--作曲家路徑 | CGR_COMPOSER_PATH | Composer 二進位檔案的路徑。 |
--基目錄 | CGR_BASE_DIR | 在哪裡儲存“全域”項目。 |
--bin目錄 | CGR_BIN_DIR | 在哪裡安裝專案二進位。 |
如果未定義這些變量,則 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 插件在全域上下文中不可用。
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 問題以取得更新。