搜尋
首頁後端開發php教程作曲家全球需要被認為有害嗎?

Composer Global Require Considered Harmful?

關鍵要點

  • 除非全局安裝的包沒有依賴項,否則將 composer global require 用於安裝跨多個項目使用的包現在被許多人認為是不好的做法。這是因為當包共享相同的空間時,可能會發生依賴衝突。
  • 另一種解決方案是使用 composer require 將每個命令行工具安裝到其自己的本地項目中,手動管理 $PATH 或二進製文件。但是,這可能會增加複雜性和乏味性。對全局命令的建議更改可能會看到一個“全局的”但隔離的項目安裝到特定位置,其供應商和 bin 目錄出現在它們通常的位置。
  • 一個新的工具 cgr (Composer Global Require) 已經被開發出來作為全局實現的替代方案。它為每個包創建隔離的安裝,避免全局依賴問題。但是,此工具仍處於概念驗證階段,可能會發生更改。建議對其進行測試,但此時不要過度依賴它。

我們之前討論過 Composer 的最佳實踐,我一直提倡在安裝可在多個項目中使用的包(特別是命令行工具)時使用 composer global require。然後,有一天,我遇到了這個討論。

Composer Global Require Considered Harmful?

簡而言之,現在大多數人似乎覺得全局 require 是不好的做法,除非全局安裝的包沒有依賴項。從技術上講,當一個人對所有項目使用單個環境時,這是有意義的,但正如我在該討論中評論的那樣,當每個項目使用虛擬機或像Docker 這樣的適當隔離的環境時,這個問題就無關緊要了,全局實際上不會造成損害。

OP 對此問題的建議解決方案是:

作為替代方案,用戶應該使用composer require 將每個命令行工具安裝到其自己的本地項目中,並手動管理其$PATH 或二進製文件(例如,通過從$PATH 中已有的bin 目錄創建符號鏈接)。

對我來說,這是一個完全不可接受的複雜化。 Composer 一直是 PHP 的驕傲,因為它易於使用,並且使包管理變得對新手友好——本地 全局。必須四處創建符號鏈接(尤其要考慮到像 Windows 這樣的非符號鏈接操作系統)會增加乏味感。然後,OP 進一步建議更改全局命令的工作方式:

可以將一個“全局的”但隔離的項目安裝到~/.composer/global/[something];其供應商和bin 目錄將出現在它們通常的位置,並且~/.composer/global/[something]/bin 目錄的內容可以在~/.composer/vendor/bin 中鏡像(通過符號鏈接),或者更好的選擇可能是~/.composer/bin。字符串 [something] 可以通過多種方式選擇;最直接的方法是 org/project(儘管這意味著將存在像 ~/.composer/global/org/project/vendor/org/project 這樣的長路徑)。

我完全同意這種方法,它似乎是兩全其美的。顯然,這可能會導致一些向後兼容性問題,但這並不意味著它不能在 Composer 的 2.0 版本中發生。 Taylor Otwell 在下面進一步回應了這種觀點:

完全同意。能夠將每個 composer 全局安裝的包安裝到其自己的隔離目錄中,並擁有其自己的隔離依賴項,而不是可能與其他全局安裝的包衝突,這將是令人驚奇的。

在此之後,本著真正的開源精神,OP 隨後將替代全局實現構建為一個單獨的工具:cgr。讓我們看看它是如何工作的。

CGR – Composer 全局 Require 替代方案

我將在 Homestead Improved 實例上執行以下所有命令

要開始使用 CGR,我們將其作為全局包安裝。

composer global require consolidation/cgr

如果 Composer 的 bin 文件夾不在 PATH 變量中,請添加它:

echo "export PATH=$PATH:$HOME/.composer/vendor/bin/" >> ~/.bashrc
echo "export CGR_BIN_DIR=$HOME/.composer/vendor/bin" >> ~/.bashrc
source ~/.bashrc

以上命令使用 Composer 的全局 bin 目錄的路徑擴展 $PATH 環境變量(Homestead Improved 上的默認位置——你的位置可能不同)。第二個命令配置 cgr 使用的 bin 目錄,而第三個命令加載這些更改。這些也將在每次以該用戶身份運行終端界面時自動加載(在我的情況下,通過 vagrant ssh 使用 Vagrant)。

然後可以通過運行 cgr 來訪問 CGR,它應該輸出 Composer 的一般幫助文件。

正確安裝全局 Composer 包

cgr phpunit/phpunit

在 Homestead Improved 上,配置了一個有用的別名,在其中鍵入 phpunit 會擴展為 vendor/bin/phpunit,這在每個項目安裝 phpunit 時非常方便,因此可以從根文件夾運行它。為了測試 PhpUnit 的全局安裝,我們需要先刪除此別名(在 ~/.bash_aliases 中註釋相應的行),然後退出 shell 並重新進入,以便別名重新加載。然後,使用版本輸出運行這個新全局安裝的 PhpUnit 應該產生類似以下內容:

vagrant@homestead:~$ phpunit --version
PHPUnit 5.4.2 by Sebastian Bergmann and contributors.

現在讓我們嘗試安裝兩個不兼容的包。

cgr laravel/installer
cgr wp-cli/wp-cli

當然,它們都可以正常安裝。讓我們檢查它們是否有效。

composer global require consolidation/cgr

一切順利!以前由於依賴項不匹配而發生衝突的全局包現在可以並排共存,並且可以在整個操作系統中使用,而不會出現任何問題!

該工具不應該/不能做什麼?

在某些情況下,您可能希望安裝 Composer 插件。如限制部分所述,由於 CGR 將每個全局包安裝到其自己的文件夾中並擁有其自己的依賴項樹,因此這些插件不會在所有全局項目中全局可用。因此,如果您想安裝更改 composer 通用行為的插件,您仍然應該使用 composer global require 而不是 cgr。例如,CGR 本身就是這樣一個插件。

接下來是什麼?

測試,測試,測試!如果您是全局 require 命令的常用用戶,我強烈建議您測試這個新工具,並向 Greg Anderson 提供一些反饋,說明它在多大程度上滿足了您的全局需求,以及是否有任何改進之處。

請注意,此工具目前只是一個概念驗證,實現方式可能會或可能不會重命名、重新打包、最終集成到 Composer 的核心等等。換句話說,盡可能多地使用它,但暫時不要過度依賴它。

在您的全局包安裝的同時,為什麼不告訴我們您對 composer global require 的看法呢?它像許多人現在認為的那樣有害嗎?還是僅僅是謹慎行事和擁有隔離的開發環境的問題?其他什麼?請在下面發表您的意見!

關於 Composer 全局 Require 的常見問題

為什麼使用 Composer 的全局 require 被認為是有害的?

Composer 的全局 require 被認為是有害的,因為它可能導致依賴衝突。當您全局安裝包時,它們都共享相同的空間,這意味著它們共享相同的依賴項集。如果兩個包需要不同版本的相同依賴項,則可能導致衝突和錯誤。建議為每個項目安裝其自己的一組依賴項,以避免此類問題。

Composer 全局 require 的替代方案是什麼?

不要使用 Composer 的全局 require,您可以為每個需要的工具創建一個新的 Composer 項目。這樣,每個工具將擁有自己的一組依賴項,從而降低衝突的風險。您還可以使用 cgr 等工具,它為每個包創建隔離的安裝,從而避免全局依賴問題。

cgr 如何幫助避免全局依賴問題?

CGR(Composer 全局 Require)是一個為每個包創建隔離安裝的工具。這意味著每個包及其依賴項都安裝在其自己的單獨目錄中,避免了不同包的依賴項之間發生衝突的風險。這使其成為使用 Composer 全局 require 的更安全替代方案。

如何安裝和使用 cgr?

要安裝 cgr,您可以使用命令 composer global require consolidation/cgr。安裝後,您可以像使用 Composer 的全局 require 一樣使用 cgr。例如,要安裝包,您可以使用命令 cgr require package-name

Composer 中本地安裝和全局安裝有什麼區別?

在 Composer 中,本地安裝意味著包及其依賴項安裝在項目的目錄中。這是安裝包的推薦方法,因為它可以避免依賴衝突。另一方面,全局安裝將包及其依賴項安裝在全局目錄中,如果不同的包需要不同版本的相同依賴項,則可能導致衝突。

如何在 Composer 中管理全局依賴項?

由於存在衝突的風險,在 Composer 中管理全局依賴項可能具有挑戰性。但是,像 cgr 這樣的工具可以通過為每個包創建隔離的安裝來提供幫助。您還可以通過為每個需要的工具創建一個新的 Composer 項目來管理全局依賴項,確保每個工具都擁有自己的一組依賴項。

我可以在 Composer 中同時使用本地安裝和全局安裝嗎?

是的,您可以在 Composer 中同時使用本地安裝和全局安裝。但是,建議盡可能使用本地安裝以避免依賴衝突。如果您需要全局使用包,請考慮使用 cgr 等工具來創建隔離的安裝。

不正確管理 Composer 中的依賴項有哪些風險?

不正確管理 Composer 中的依賴項可能導致衝突和錯誤。如果兩個包需要不同版本的相同依賴項,則可能會導致難以調試的問題。它還可能導致應用程序出現意外行為,因為不同版本的依賴項可能具有不同的功能和行為。

如何解決 Composer 中的依賴衝突?

要解決 Composer 中的依賴衝突,您可以嘗試將包更新到最新版本,因為這可能會解決衝突。如果這不起作用,您可能需要重新考慮您正在使用的包並找到沒有衝突依賴項的替代方案。像 cgr 這樣的工具也可以通過為每個包創建隔離的安裝來提供幫助。

如何保持 Composer 依賴項的最新狀態?

要保持 Composer 依賴項的最新狀態,您可以使用 composer update 命令。這會根據 composer.json 文件中指定的版本約束將所有包更新到其最新版本。您還可以使用 composer outdated 命令查看哪些包有可用的較新版本。

以上是作曲家全球需要被認為有害嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在Laravel中使用Flash會話數據在Laravel中使用Flash會話數據Mar 12, 2025 pm 05:08 PM

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

php中的捲曲:如何在REST API中使用PHP捲曲擴展php中的捲曲:如何在REST API中使用PHP捲曲擴展Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

簡化的HTTP響應在Laravel測試中模擬了簡化的HTTP響應在Laravel測試中模擬了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12個最佳PHP聊天腳本在Codecanyon上的12個最佳PHP聊天腳本Mar 13, 2025 pm 12:08 PM

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

解釋PHP中晚期靜態結合的概念。解釋PHP中晚期靜態結合的概念。Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

PHP記錄:PHP日誌分析的最佳實踐PHP記錄:PHP日誌分析的最佳實踐Mar 10, 2025 pm 02:32 PM

PHP日誌記錄對於監視和調試Web應用程序以及捕獲關鍵事件,錯誤和運行時行為至關重要。它為系統性能提供了寶貴的見解,有助於識別問題並支持更快的故障排除

如何註冊和使用Laravel服務提供商如何註冊和使用Laravel服務提供商Mar 07, 2025 am 01:18 AM

Laravel的服務容器和服務提供商是其架構的基礎。 本文探討了服務容器,詳細信息服務提供商創建,註冊,並通過示例演示了實際用法。 我們將從OVE開始

自定義/擴展框架:如何添加自定義功能。自定義/擴展框架:如何添加自定義功能。Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。