繁体   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