簡體   English   中英

如何在沒有 Composer 的情況下安裝 Composer PHP 軟件包?

[英]How do I install Composer PHP packages without Composer?

我正在嘗試安裝 Coinbase PHP API,但它需要 Composer:

https://github.com/coinbase/coinbase-php

我正在尋找一個通用的 PHP 解決方案(也許是一個函數),讓我可以將 Composer 包直接安裝到我的服務器上,而不必使用 Composer。

我認為 Composer 的開發人員相信他們正在幫助人們,但實際上有成千上萬的初學者開發人員被“Composer 障礙”鎖定在學習 Web 開發之外。

如果有一個靈活的解決方案或某種方法可以在沒有 Composer 的情況下進行安裝,那真的會有所幫助嗎? 我怎樣才能做到這一點?

請不要用一些諷刺的評論來回應 有些人不想使用 Composer,我不明白為什么我們應該被趕到特定的第三方軟件中以進行 Web 開發。

您可以嘗試https://php-download.com/ ,它可以幫助您在大多數情況下下載所有依賴項以及vendor文件夾。 它承諾不需要作曲家。 我自己試過了。 它會查找並創建所有必需的文件夾並將其壓縮以供下載。 完美運行!

composer.json文件列出了依賴項。 在你的例子中:

"require": {
    "php": ">=5.5.0",
    "guzzlehttp/guzzle": "^6.0",
    "psr/http-message": "^1.0",
    "psr/log": "^1.0"
},

然后您必須在packagist站點中找到相應的包。 對每個依賴項重復相同的過程:在相應的composer.json文件中找到其他依賴項並再次搜索。

當您最終擁有所需軟件包的完整列表時,您只需將它們一一安裝即可。 大多數情況下,只需將文件放在項目目錄中的某個位置即可。 但是您還必須確保 PHP 可以找到所需的類。 由於您沒有使用 Composer 的自動加載器,您需要將它們添加到您自己的自定義自動加載器中。 您可以從相應的composer.json文件中找出信息,例如:

"autoload": {
    "psr-4": { "Coinbase\\Wallet\\": "src/" }
},

如果您不使用類自動加載器,則需要找出各個require_once語句。 您可能需要大量的反復試驗,因為大多數庫作者不會關心記錄這些。

另外,以防萬一對此有混淆:

  • Composer 具有適用於 Windows 的官方 GUI 安裝程序和適用於所有平台的復制和粘貼命令行安裝程序。
  • Composer 可以在本地運行,其輸出可以上傳到其他地方。 您的共享主機不需要 SSH。
  • 安裝庫所需的命令可以從包網站復制和粘貼——即使包維護者不關心記錄它,packagist.org 默認生成它。

Composer 並不完美,它並不適合所有用例,但是,在安裝依賴於它的庫時,它無疑是最好的選擇,而且相當不錯。


我已經檢查了我的其他答案。 它們主要分為兩類:

  1. 安裝庫並用它編寫自定義下載腳本
  2. 為 Composer 使用基於 Web 的在線界面

除非我遺漏了什么,否則他們都沒有解決 OP 表達的投訴:

  • 學習曲線
  • 使用第三方軟件
  • 可以在服務器上進行開發(我假設使用 SSH)
  • 潛在的深度依賴樹

我正在為網站使用共享主機,但無法在那里執行命令。 除了通過瀏覽器請求的 php 腳本請求運行 composer 之外,我通常使用以下工作流程:

  • 確保您在本地安裝了 php。
  • 在桌面上制作目錄。
  • https://getcomposer.org/download/ (在標題*Manual Download 下)下載 composer.phar 並將其放在目錄中。
  • 制作一個文件composer.json在其中粘貼以下內容

     { "require": { "coinbase/coinbase": "~2.0" } }
  • 使用您選擇的 shell 瀏覽到目錄(bash、git-bash、cmd、windows bash)

  • 輸入php composer.phar update bash 輸出截圖
  • 通過 ftp 或您使用的任何機制將供應商目錄上傳到您的網絡服務器。
  • 包含在您加載庫的 php 項目中(修改上傳供應商目錄的路徑,以便它包含該自動加載文件)

     require_once('vendor/autoload.php');

通過這種方式,您可以獲得依賴項管理的好處,並且您不必手動包含所有海量文件並手動下載所有依賴項,更新它們就像輸入php composer.phar update然后替換供應商目錄一樣簡單在您的服務器上使用新的。

我必須為我沒有 SSH 訪問權限的 FTP 服務器執行此操作。 此處列出的站點有效,然后我意識到您可以在自己的服務器上安裝 Composer(使用目標的 PHP 版本),然后復制所有文件。

一個對我有用的替代解決方案(因為 php-download 已關閉)可以通過制作您自己的小型本地 composer 下載器來完成。

  1. 在本地下載並安裝 XAMPP: https : //www.apachefriends.org/index.html
  2. 在本地下載並安裝 composer: https : //getcomposer.org/download/
  3. 打開命令提示符,導航到c:\\temp並簡單地輸入 Composer 依賴項,例如: composer require league/oauth2-client
  4. 使用 FTP 程序將文件從c:\\temp文件夾復制到 Web 主機
  5. 將此添加到您的 php 頂部: require("vendor/autoload.php");

這不是最終的解決方案,但對我來說,這對大多數情況都有很大幫助: https : //github.com/Wilkins/composer-file-loader

允許您像 composer 那樣加載 composer.json 文件。 這允許你在沒有 composer 的情況下加載 composer.json 文件(所以理論上 PHP 5.2 就足夠了)

我知道這個問題很老,但我希望它會幫助某人。

分析問題

沒有 Composer情況下安裝依賴項的問題是自動加載系統。

Composer 使用基於數組映射的自制自動加載器,這是事實上的標准 但是這個自動加載系統,在這種情況下“幸運”,不符合 PSR-4。

PSR-4 是在 PHP 中自動加載類的de-iure 標准,因此您無法擺脫自動加載。 您必須使用其中之一。

解決方案建議

在這種情況下,只要您在源代碼的早期需要自定義autoload.php文件,就可以手動配置這個出色的 PSR-4 自動加載器,以在代碼的任何位置的VendorNamespace自動加載VendorClass

現實生活中的例子

讓我們看看這個例子:我有一個遺留項目,他不能也不會使用 Composer,即使上帝奇跡般地允許這樣做。 使用這個出色的命令行腳本包可以加快該項目的開發速度。 這是我的項目目錄結構:

 - src
 - tests
 - vendor (not the Composer's one)

這個包有這個目錄結構:

 - examples
 - src
   - Commando
 - tests

我唯一需要的是src文件夾。 將此文件夾放在我的供應商文件夾中就可以了。 所以我的自定義自動加載器會是這樣的:

// Constants
$base_path = "path\to\my\project";
$autoloader_class = '\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';
define("BASE_PATH", str_replace("\\", DIRECTORY_SEPARATOR, $base_path));

// Autoloader
require_once BASE_PATH.'\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';

// Init the autoloader.
$package = [
    "nategood\commando" => [
        "namespace" => "Commando",
        "path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\nategood\commando\src\Commando')
    ],
    "kevinlebrun\colors.php" => [
        "namespace" => "Colors",
        "path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\kevinlebrun\colors.php\src\Colors')
    ]
];

// Register namespaces.
$loader = new \PSR4\Psr4AutoloaderClass;
$loader->register();
                      // Namespace                                      // Path to source
$loader->addNamespace($package["nategood\commando"]["namespace"],       BASE_PATH.$package["nategood\commando"]["path"]);
$loader->addNamespace($package["nategood\commando"]["namespace"],       BASE_PATH.$package["nategood\commando"]["path"]."\Util");
$loader->addNamespace($package["kevinlebrun\colors.php"]["namespace"],  BASE_PATH.$package["kevinlebrun\colors.php"]["path"]);

現在我可以在我的項目中的任何地方使用命令包了!

優點缺點

此解決方案允許您:

  • Easely和手動構建自己的自定義自動加載(你只需要指定VendorNamespace並在搜索文件夾(S) VendorClass在ES VendorNamespace
  • 在項目文件夾中的任何位置自由組織您的作曲家依賴項(為什么不,在它之外)
  • 在您的項目中按原樣導入 Composer 包(使用 Composer 在本地下載或克隆包存儲庫)或其中的相關部分(即刪除 composer.json 文件或需要 Composer 自動加載器的文件)。

缺點:

  • 手動構建自定義自動加載器意味着處理項目的每個必需依賴項(我希望不是很多)。
  • 包源路徑中的錯誤可能既乏味又令人沮喪。
  • 僅適用於符合 PSR-4 的文件名(即不能使用A.class.php文件名)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM