Composer 类映射自动加载不会在文件夹中加载新文件

Posted

技术标签:

【中文标题】Composer 类映射自动加载不会在文件夹中加载新文件【英文标题】:Composer classmap autoload does not load new files in folder 【发布时间】:2014-10-26 11:07:09 【问题描述】:

以下问题:我在composer.json中定义了一个classmap:

"autoload": 
    "classmap": [
        "app/controllers",
        "app/models",
        "app/helper.php"
    ]   

但是,当我在“controllers”或“models”文件夹中创建一个新文件时,它不会加载它们,我总是需要制作一个 composer dump-autoload。

这是正确的行为吗?我以为 composer 的自动加载器会监视文件夹中的新文件吗?

【问题讨论】:

【参考方案1】:

是的,这是正确的行为。如果您希望自动加载新类,则必须使用 PSR-0 或 PSR-4 自动加载。

生成类映射需要 Composer 知道包含某个类的文件名。这只能通过解析目录中的整个源代码并扫描类、接口和特征定义来完成。

这通常是一个 CPU 和 I/O 密集型任务,因此仅当 Composer 安装/更新或(按需)转储自动加载器时才会执行此操作,并非每个require "vendor/autoload.php"; 都执行此操作。

请注意,类映射自动加载仅适用于未实现至少 PSR-0 的旧代码库。它不适用于新代码 - 除非您想在开发过程中一次又一次地转储自动加载器。

【讨论】:

"请注意,类映射自动加载仅适用于未实现至少 PSR-0 的旧代码库"。不完全正确。请参阅 dump-autoload 的文档:“--optimize (-o): Convert PSR-0/4 autoloading to classmap to get a faster autoloader. 这特别推荐用于生产,但可能需要一些时间来运行,所以它目前默认情况下未完成。” 优化自动加载器与定义自动加载方案不同。如果 PHP 的未来版本为 PSR-4 提供引擎级支持,Composer 可能会在优化此类版本时放弃类图,但如果该类图是定义自动加载的方式,则必须保留类图。【参考方案2】:

通过 SSH 转到服务器的根目录。现在执行以下操作:

    运行ls 列出所有文件。 你会看到composer.lock文件;使用rm composer.lock 命令删除文件。 现在运行php composer update 命令。

根据您的 linux 类型,您可能需要运行 php-cli composer update

第 3 步将创建一个新的 composer.lock 文件,您的所有类都将再次加载。在添加新课程时执行此操作。

或:

    运行composer dump-autoload 命令。

【讨论】:

【参考方案3】:

正如已经指出的那样,这是正确的行为。如果您希望自动加载新类,则必须使用 PSR-0 或 PSR-4 自动加载。

指定的classmap自动加载类型为composer.json,主要用于不遵循PSR-0或PSR-4的遗留项目。我最近开始从事这样的项目,并想尝试在创建新类时自动运行composer dump-autoload 命令。如果不包括项目中的所有作曲家源,这实际上很棘手。我想出这个只是为了提醒开发人员他们需要转储类图:

$loader = include_once 'vendor/autoload.php';
if ( ! $loader ) 
    throw new Exception( 'vendor/autoload.php missing please run `composer install`' );


spl_autoload_register(
    function ( $class ) 
        if ( 'A_Common_Class_Prefix' === substr( $class, 0, 10 ) ) 
            throw new Error( 'Class "' . $class . '"" not found please run `composer dump-autoload`' );
        
    ,
    true
);

这会注册另一个自动加载器,它在作曲家的自动加载器之后运行,因此作曲家没有找到的任何类都将传递给它。如果类与前缀匹配,则会抛出异常,提醒开发人员重新转储自动加载器并更新类映射。

【讨论】:

【参考方案4】:

对我来说,不知何故它不适用于 Yii 1 类映射,当我添加时 - 需要它以及存在的许多其他库 - 我不记得确切可能是我手动编辑了文件或文件权限是罪魁祸首,由于某种原因,它没有重新生成,即使我删除了 composer.lock 并完全删除了供应商文件夹 - 据我所知,可能是一些缓存,但有效的帮助是首先单独安装这个单一的库,它生成类映射,然后我在第二步中一次单独添加了所有其他剩余的库,中提琴,一切都可以加载。

【讨论】:

以上是关于Composer 类映射自动加载不会在文件夹中加载新文件的主要内容,如果未能解决你的问题,请参考以下文章

为啥核心数据不会在 swiftui 类中加载,但会在结构视图中加载

在laravel中加载一个作曲家类

如何在qt中加载使用QuiLoader加载的ui文件的类文件

composer 将远程的包更改为本地开发模式

在 google play 控制台中加载映射文件

如何减少在 python 中加载泡菜文件或将泡菜文件映射到磁盘的时间