Composer 供应商/文件夹 FTP 上传

Composer vendor/ folder FTP upload

我有一个加载了 Composer 库的本地项目。我将此项目上传到我的 FTP 并收到错误,与某些库中未找到 类 有关。

我可以简单地将 vendor/ 文件夹复制到 FTP 还是我遗漏了什么?

收到错误: Fatal error: Class 'AAA\Core\Tools' not found in /home/aaa/public_html/api.php on line 11

api.php:

<?php
    use AAA\Core\Tools;

    require_once("./vendor/autoload.php");
    require_once("./api/" . Tools::getFieldValue('controller') . ".php");

localhost 上一切正常!

你有没有告诉作曲家你的 Class 'AAA\Core\Tools' 在哪里?

You can even add your own code to the autoloader by adding an autoload field > to composer.json.

{
    "autoload": {
        "psr-4": {"Acme\": "src/"}
    }
}

首先,我会检查 composer 生成的自动加载器文件,以确保路径在您的 linux 服务器上有效。

另一个简单但常见的问题是 windows 上的文件夹和文件名不区分大小写,但它们在 Linux 上。仔细检查文件夹和文件是否具有正确的大小写,否则它不会找到它们来自动加载。

Linux 具有区分大小写的文件系统。这意味着文件 Alex.txtalex.txt 在 Windows 中是相同的,但在 Linux 中则不同。实际上在 Linux 上,两者可以愉快地生活在同一个目录中:

$ tree .                                                    
.
├── alex.txt
└── Alex.txt

0 directories, 2 files

考虑到这一点,我会尝试仔细检查您在命名空间中使用的路径是否实际上与在文件系统级别找到的路径相同。 (即:AAA目录只有大写字母;Core目录大写,Tools.php文件大写


如果您想保留现有的文件系统布局,可以使用 PSR-4 显式告诉 Composer 如何将命名空间映射到文件系统:

  1. 更改 composer.json 中的 autoload 部分:

    {
        "autoload": {
            "psr-4": {"AAA\DB\": "db/"}
        }
    }
    

    其中db/是来自文件系统的实际路径

  2. 更新自动加载器:

    $ composer dump-autoload
    

这将处理目录名称,但不适用于文件。这意味着 db/ 中的任何文件必须完全按照名称空间中的名称命名( 对于 use AAA\DB\DBCore 的用法,文件 必须 db/DBCore.php).

如果您的文件名为 dbcore.php,并且您想在您的命名空间中将其引用为 DBCore,您可以使用 Composer 的 classmap 功能:

"autoload": {
    "classmap": [
        "db/dbcore.php"
    ]
}

dbcore.php:

<?php

namespace AAA\DB;

class DBCore
{
}

您可以照常使用它:

<?php
require_once("./vendor/autoload.php");
$dbCore = new \AAA\DB\DBCore();

Composer 不应该以这种方式使用(即您不应该手动将供应商目录从一个环境转移到另一个环境)。

当您向项目添加依赖项时,composer.json 文件将包含这些依赖项。当您 运行 在您的本地主机上安装或更新 composer 时,它 "locks" 您项目的那些依赖项的当前版本并将它们存储在 composer.lock 文件中。您应该将 composer.json 和 composer.lock 文件从您的开发环境传输到您的生产环境,然后在您的生产环境中 运行ning composer install 作为部署过程的一部分。当您 运行 composer install 在您的生产环境中时,Composer 将查看您的 composer.lock 文件并在生产环境的 vendor 目录中安装指定版本的依赖项。

您可能需要查看有关基本用法 (https://getcomposer.org/doc/01-basic-usage.md) and command line options (https://getcomposer.org/doc/03-cli.md) 的作曲家文档以了解更多详细信息。

与其尝试通过 FTP 上传,我认为这将是棘手的,如果不是不可能的话,我建议您探索让 composer 在您的托管环境中工作。

Composer 完全基于 PHP,因此 运行 任何 PHP 是 运行ning 的地方。

如果您没有命令行访问权限,您可以使用 PHPShell 之类的东西,它会为您提供一个基于 PHP 的命令行,然后您可以在上面 运行 Composer。

See this other SO answer 以获取有关如何使用 PHPShell.

的一些提示

另一种选择是通过在浏览器中以经典的 PHP 方式访问它来构建一个您实际上 运行 的小 PHP 包装器。 See this other SO answer for some tips on how to do that.

最重要的是,您真的应该考虑在您的服务器上安装 Composer 运行ning,而不是尝试以其他方式避开它。

一旦您在服务器上完成了您的 composer 进程,您必须删除您创建的 PHPShell 或 composer 包装器,这样您就不会留下任何安全漏洞。