在不包含文件的情况下使用 Composers 自动加载器

Using Composers autoloader without including files

我有一个遗留项目,它使用 "autoload" 定义中的 "files" 部分进行一些初始化。这个初始化依赖于一些框架。我想要做的是在没有框架存在的情况下使这个代码库的几个单元测试可运行。我遗留项目的代码是通过 "psr-4" 和 "classmap" 在 "autoload" 中混合加载的。此外,该项目依赖于通过 Composer 加载的许多库。

这意味着我不能像往常一样在我的测试 bootstrap 中只包含作曲家自动加载器 (vendor/autoload.php)。我曾尝试在 vendor/composer 中仅包括类映射、命名空间和 psr-4 加载器,但在深入研究 Composer 代码后发现它并不那么简单。

有没有一种比较明智的方法来使用 Composer 生成的自动加载器而不包含 "autoload" 部分中定义的 "files"?

一个可行但不是很好的解决方案是自己创建 Composer 自动加载器的实例并自己注册 psr-4、classmap 和 psr-0 定义。

假设您的测试 bootstrap 位于项目根目录的子目录中,以下代码应该有效:

require __DIR__ . '/../vendor/composer/ClassLoader.php';

call_user_func( function() {
    $loader = new \Composer\Autoload\ClassLoader();

    foreach ( require __DIR__ . '/../vendor/composer/autoload_namespaces.php' as $namespace => $path ) {
        $loader->set( $namespace, $path );
    }

    foreach ( require __DIR__ . '/../vendor/composer/autoload_psr4.php' as $namespace => $path ) {
        $loader->setPsr4( $namespace, $path );
    }

    $classMap = require __DIR__ . '/../vendor/composer/autoload_classmap.php';

    if ( $classMap ) {
        $loader->addClassMap( $classMap );
    }

    $loader->register( true );
} );

这将永远不会使用来自 Composer 自动加载器的 "static initialization" 代码路径。据我所知,这只是为了优化目的,所以这不应该成为测试的问题。