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

我正在尝试安装 Coinbase PHP API,但它需要 Composer:

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

我正在寻找一个通用的 PHP 解决方案(可能是一个函数) ,让我直接安装编写器包到我的服务器上,而不必使用编写器。

我认为 Composer 的开发人员相信他们是在帮助人们,但实际上有成千上万的初学者开发人员被“ Composer 障碍”锁在了学习 web 开发的门外。

如果有一个灵活的解决方案或者一些不需要 Composer 就可以安装的方法,那将会非常有帮助?我怎么能这么做?

请不要用一些讽刺的评论来回应。有些人不想使用 Composer,我不明白为什么我们应该被赶进一个特定的第三方软件来做网页开发。

103853 次浏览

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

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

然后,您必须在 包装商站点中找到相应的包。对每个依赖项重复相同的过程: 在相应的 composer.json文件中查找其他依赖项,然后再次搜索。

当您最终得到所需软件包的完整列表时,您只需要一个接一个地安装它们。在大多数情况下,只需要将文件放到项目目录中的某个位置即可。但是您还必须确保 PHP 可以找到所需的类。因为您没有使用 Composer 的自动加载程序,所以需要将它们添加到您自己的自定义自动加载程序中。你可以从相应的 composer.json文件中找出这些信息,例如:

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

如果不使用类自动装入器,则需要计算出各个 require_once语句。您可能需要大量的尝试和错误,因为大多数图书馆作者不会关心记录这些。

还有,以防你们搞混了:

  • Composer 为 Windows 提供了一个官方的 GUI 安装程序,并为所有平台提供了一个 复制粘贴命令行安装过程。
  • 编写器可以在本地运行,它的输出刚刚上传到其他地方。
  • 安装库所需的命令可以从软件包网站上复制和粘贴ーー即使软件包维护人员不愿意记录它,packagist.org 也会默认生成它。

Composer 并不完美,也不适合所有的用例,但是,当安装一个依赖它的库时,它无疑是最好的选择,而且相当不错。


我检查了之后的其他答案,它们大多分为两类:

  1. 安装一个库并用它编写一个自定义下载脚本
  2. 为 Composer 使用在线的基于 Web 的界面

除非我漏掉了什么,否则他们都没有提到《观察家报告》所表达的抱怨:

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

您可以尝试 https://php-download.com/,它可以帮助您下载所有的依赖大部分时间随着 vendor文件夹。它承诺不需要作曲家。 我自己也试过。它可以找到并创建所有需要的文件夹,然后压缩下载。非常好用! !

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

这不是最终的解决方案,但对我而言,它对大多数案例都有很大帮助: Https://github.com/wilkins/composer-file-loader

允许您像作曲家那样加载 poser.json 文件。 这允许您在不使用作曲器的情况下加载 poser.json 文件(因此 从理论上讲,PHP 5.2就足够了)

我知道这个问题很老了,但我希望它能帮到某人。

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

  • 确保在本地安装了 php。
  • 在桌面上创建目录。
  • https://getcomposer.org/download/下载 poser.phar (在头 * 手册下载下)并将其放在目录中。
  • 使文件 作曲家 Json粘贴以下内容

     {
    "require": {
    "coinbase/coinbase": "~2.0"
    }
    }
    
  • Browse to the directory with the shell of your choice(bash, git-bash, cmd, windows bash)

  • type php composer.phar update screenshot of bash output
  • Upload the vendor directory to your webserver via ftp or whatever mechanic you use.
  • include in your php project where you load your libraries(modify path to where you uploaded the vendor dir so it will include that autoload file)

    require_once('vendor/autoload.php');
    

This way you get the benefit of dependency management and you don't have to include manually all the gazillion of files and download all the dependencies manually, and updating them is just as easy as typing php composer.phar update and then replacing the vendor dir on your server with the new one.

另一个对我有用的解决方案(因为 php 下载关闭了)可以通过制作您自己的本地作曲家下载程序来完成。

  1. 本地下载并安装 XAMPP: https://www.apachefriends.org/index.html
  2. 本地下载并安装编写器: https://getcomposer.org/download/
  3. 打开命令提示符,导航为说 c:\temp,然后简单地键入作曲家依赖关系,例如: composer require league/oauth2-client
  4. 使用 FTP 程序将文件从 c:\temp文件夹复制到 Web 主机
  5. 把这个添加到你的 php: require("vendor/autoload.php");的顶部

分析问题

安装依赖项 没有作曲家时的问题是自动加载系统。

作曲家使用一个自制的基于阵列地图的自动加载程序,这是一个 事实上的标准。 但是,这种自动加载系统,“幸运的是”在这种情况下,是不符合 PSR-4。

PSR-4是用于在 PHP 中自动加载类的 死亡标准,所以你不能逃避自动加载。你必须使用其中之一。

解决方案建议

在这种情况下,只要您在源代码的早期需要定制的 autoload.php文件,就可以手动配置 这个聪明的 PSR-4自动装弹机在代码的任何地方自动加载 VendorNamespace中的 VendorClass

现实生活中的例子

让我们看看这个例子: 我有一个遗产项目谁不能也不会使用作曲家从来没有,即使上帝允许这与奇迹。这个项目可以在这个神奇的 用于命令行脚本的包开发加速。 这是我的项目目录结构:

 - 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中搜索 VendorClasses 的文件夹)。
  • 可以在项目文件夹的任何位置自由地组织您的作曲家依赖(以及为什么不能在项目文件夹之外)
  • 按照项目中的方式导入作曲家软件包(使用 Composer 在本地下载或克隆软件包存储库)或其相关部分(即删除 Composer.json 文件或需要作曲家自动加载程序的文件)。

缺点:

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