我正在尝试安装 Coinbase PHP API,但它需要 Composer:
https://github.com/coinbase/coinbase-php
我正在寻找一个通用的 PHP 解决方案(可能是一个函数),让我可以将 composer 包直接安装到我的服务器上,而无需使用 Composer。
我认为 Composer 的开发人员相信他们正在帮助人们,但实际上有成千上万的初学者开发人员因为“Composer 障碍”而无法学习 Web 开发。
如果有一个灵活的解决方案或某种方法可以在没有 Composer 的情况下安装,那真的会有所帮助吗?我怎样才能做到这一点?
请不要回复一些讽刺的评论。有些人不想使用 Composer,我不明白为什么我们应该被赶到特定的第三方软件中来进行 Web 开发。
include
这些文件。
您可以尝试 https://php-download.com/,它可以帮助您在大多数情况下连同 vendor
文件夹一起下载所有依赖项。它保证不需要作曲家。我自己试过了。它会查找并创建所有必需的文件夹并将其压缩以供下载。完美运行!
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 并不完美,它并不适合所有用例,但是在安装依赖它的库时,它无疑是最好的选择,而且是一个相当不错的选择。
我已经检查了我之后的其他答案。它们主要分为两类:
安装库并使用它编写自定义下载脚本 为 Composer 使用基于 Web 的在线界面
除非我遗漏了什么,否则他们都没有解决 OP 表达的抱怨:
学习曲线
使用第三方软件
可以在服务器上进行开发(我想使用 SSH)
潜在的深度依赖树
我正在为网站使用共享主机,无法在那里执行命令。除了通过浏览器请求的 php 脚本请求运行 composer 之外,我通常使用以下工作流程:
确保您在本地安装了 php。
在桌面上制作目录。
从 https://getcomposer.org/download/ 下载 composer.phar(在标题 *Manual Download 下)并将其放在目录中。
制作一个 composer.json 文件,在其中粘贴以下内容 { "require": { "coinbase/coinbase": "~2.0" } }
使用您选择的 shell 浏览到目录(bash、git-bash、cmd、windows bash)
键入 php composer.phar 更新
通过 ftp 或您使用的任何机制将供应商目录上传到您的网络服务器。
包含在您加载库的 php 项目中(修改您上传供应商目录的路径,以便它包含该自动加载文件) require_once('vendor/autoload.php');
通过这种方式,您可以获得依赖项管理的好处,并且您不必手动包含所有海量文件并手动下载所有依赖项,并且更新它们就像输入 php composer.phar update
然后替换您的供应商目录一样简单服务器与新的。
可以通过制作自己的小型本地作曲家下载器来完成对我有用的替代解决方案(因为 php-download 已关闭)。
在本地下载并安装 XAMPP:https://www.apachefriends.org/index.html 在本地下载并安装 composer:https://getcomposer.org/download/ 打开命令提示符,导航到 c:\temp 并简单地输入composer 依赖,例如:composer require League/oauth2-client 使用 FTP 程序将文件从你的 c:\temp 文件夹复制到你的 web 主机添加到你的 php 的顶部: require("vendor/autoload.php") ;
我必须为我没有 SSH 访问权限的 FTP 服务器执行此操作。此处列出的站点有效,然后我意识到您可以在自己的服务器上安装 composer(使用目标的 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
文件,就可以手动将 this brilliant PSR-4 autoloader 配置为在代码中的任何位置自动加载 VendorNamespace
中的 VendorClass
。
现实生活中的例子
让我们看一下这个例子:我有一个遗留项目不能也不会使用 Composer,即使上帝允许奇迹发生,也永远不会使用 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 中搜索 VendorClasses 的文件夹。
在项目文件夹中的任何位置自由组织您的作曲家依赖项(为什么不,在它之外)
导入项目中的作曲家包(使用 Composer 在本地下载或克隆包存储库)或其相关部分(即删除 composer.json 文件或需要作曲家自动加载器的文件)。
缺点:
手动构建您的自定义自动加载器意味着处理项目的每个所需依赖项(我希望不是很多)。
包源路径中的错误可能是乏味且令人沮丧的。
仅适用于符合 PSR-4 的文件名(即不能使用 A.class.php 文件名)
不定期副业成功案例分享