如何在没有Composer的情况下安装Composer PHP软件包?

mutmk8jj  于 2023-09-29  发布在  PHP
关注(0)|答案(6)|浏览(262)

我正在尝试安装Coinbase PHP API,但它需要Composer:
https://github.com/coinbase/coinbase-php
我正在寻找一个通用的PHP解决方案(也许是一个函数),让我直接安装 composer 包到我的服务器上,而不必使用 composer 。

hgqdbh6s

hgqdbh6s1#

composer.json file列出了依赖项。在您的示例中:

"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.安装一个库并用它编写一个自定义下载脚本
1.为Composer使用基于Web的在线界面
除非我错过了什么,他们都没有解决OP表达的抱怨:

  • 学习曲线
  • 使用第三方软件
  • 在服务器上开发的可能性(我假设使用SSH)
  • 潜在深度依赖树
3npbholx

3npbholx2#

我正在为一个网站使用共享主机,无法在那里执行命令。除了通过浏览器请求的php脚本请求运行composer之外,我通常使用以下工作流:

  • 确保你在本地安装了php。
  • 在桌面上创建目录。
  • https://getcomposer.org/download/下载composer.phar(在标题 *Manual Download**下)并将其放置在目录中。
  • 创建一个文件 * composer.json *,在其中粘贴以下内容
{
     "require": {
         "coinbase/coinbase": "~2.0"
     }
 }
  • 浏览到包含您选择的shell(bash、git-bash、cmd、windowsbash)的目录
  • 型号php composer.phar update x1c 0d1x
  • 通过ftp或任何你使用的机制上传供应商目录到你的网络服务器。
  • 包括在加载库PHP项目中(修改上传供应商目录的路径,使其包含自动加载文件)
require_once('vendor/autoload.php');

通过这种方式,您可以获得依赖项管理的好处,并且不必手动包含所有大量文件并手动下载所有依赖项,并且更新它们就像键入php composer.phar update然后将服务器上的供应商目录替换为新目录一样简单。

lawou6xi

lawou6xi3#

另一个对我有用的解决方案(因为php-download已经关闭)可以通过制作自己的小型本地 composer 下载器来完成。
1.下载并在本地安装XAMPP:https://www.apachefriends.org/index.html
1.下载并在本地安装composer:https://getcomposer.org/download/
1.打开commandprompt,导航到c:\temp,然后简单地键入composer dependency,例如:composer require league/oauth2-client
1.使用FTP程序将文件从c:\temp文件夹复制到Web主机
1.把这个添加到你的php的顶部:require("vendor/autoload.php");

f0brbegy

f0brbegy4#

这不是最终的解决方案,但对我来说,这对大多数情况都有很大的帮助:https://github.com/Wilkins/composer-file-loader
允许您加载composer.json文件,就像composer一样。这允许你在没有composer的情况下加载composer.json文件(所以理论上PHP 5.2就足够了)
我知道这个问题已经很老了,但我希望它能帮助到一些人。

x6492ojm

x6492ojm5#

我不得不这样做的FTP服务器,我没有SSH访问。这里列出的网站工作,然后我意识到你可以做一个 composer 安装在自己的服务器上(使用您的目标的PHP版本),然后复制所有的文件。

9rbhqvlz

9rbhqvlz6#

分析问题

安装依赖项不使用Composer的问题在于自动加载系统。
Composer使用一个基于数组Map的自制自动加载器,这是一个 * 事实上的标准 *。但是这个自动加载系统,“幸运的是”,在这种情况下,是不符合PSR-4。
PSR-4是PHP中自动加载类的 *de-iure标准 *,所以你不能逃避自动加载。你必须使用其中一个。

解决方案

在这种情况下,只要您在源代码的早期需要自定义的autoload.php文件,就可以手动配置this brilliant PSR-4 autoloader,以便在代码中的任何地方自动加载VendorNamespace中的VendorClass

真实的例子

让我们看看这个例子:我有一个遗留项目,他不能也不会使用Composer,即使上帝允许奇迹发生。这个项目可以在这个梦幻般的package for command line scripts的发展速度。这是我的项目目录结构:

- 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"]);

现在我可以在我的项目中的任何地方使用命令包!

优缺点

此解决方案允许您:

  • 轻松手动构建您自己的自定义自动加载器(您只需指定VendorNamespace和在VendorNamespace中搜索VendorClass的文件夹。
  • 在项目文件夹中的任何地方自由地组织您的 composer 依赖项(为什么不呢,在它之外)
  • 导入一个composer包,就像在你的项目中一样(使用Composer本地下载或克隆包存储库)或它的相关部分(即删除composer.json文件或需要composer自动加载器的文件)。

缺点:

  • 手动构建你的自定义自动加载器意味着在你的项目的每个所需的依赖项上工作(我希望不是很多)。
  • 软件包源路径中的错误可能会令人厌烦和沮丧。
  • 仅适用于PSR-4兼容文件名(即不能使用A.class.php文件名)

相关问题