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 类中加载,但会在结构视图中加载