我有一个遗留项目,它使用"autoload"定义中的"files"部分进行一些初始化。这个初始化依赖于一些框架。我试图做的是使这个代码库的几个单元测试在没有框架的情况下可以运行。我的遗留项目的代码通过"autoload"内部的"psr-4"one_answers"classmap"的混合加载。此外,这个项目依赖于通过Composer加载的一些库。
这意味着我不能像通常那样在我的测试引导中包含编写器自动加载器(vendor/autoload.php
)。我已经尝试在vendor/composer
中只包括classmap,命名空间和psr-4加载器,尽管在Composer代码中进行了一些挖掘后发现这并不是那么简单。
是否有某种相同的方法来使用Composer生成的自动加载器,而不包括在"自动加载"部分中定义的"文件"?
一个可行但不太好的解决方案是自己创建一个Composer自动加载器的实例,并自己注册psr-4、classmap和psr-0定义。
假设您的测试引导位于项目根目录的子目录中,那么下面的代码应该可以工作:require __DIR__ . '/../vendor/composer/ClassLoader.php';
call_user_func( function() {
$loader = new ComposerAutoloadClassLoader();
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自动加载器中的"静态初始化"代码路径。据我所知,这只是为了优化目的,所以这应该不是测试的问题。