所以-我的bootstrap.php中有一个简单的PCR0自动加载器,它应该从供应商目录加载任何与PCR0兼容的库类。。。
spl_autoload_register( function( $classname ) {
$path = preg_match( '/\\/', $classname )
? str_replace( '\', DIRECTORY_SEPARATOR, $classname )
: str_replace( '_', DIRECTORY_SEPARATOR, $classname );
$file = VENDORS_PATH . DIRECTORY_SEPARATOR . $path . '.php';
if ( file_exists( $file ) ) {
require_once( $file );
}
});
我不确定我是否理解composer为什么在供应商目录(即composer和autoload.php文件)中生成自动加载文件?
我可以阻止Composer生成那些自动加载程序文件吗?还是我错过了什么?我觉得我不需要它们?
有三个自动加载相关的文件,每个文件都有不同的用途。
- vendor/autoload.php初始化composer的自动加载器。Composer提供了一个自动加载器,可以加载与Composer兼容的库
- vendor/compooser/autoload_classmap.php这个文件由classmap自动加载器使用,它适用于甚至与PSR-0不兼容的库,或者生产环境(classmap比通过文件系统查找更快)
- vendor/comporter/autoload_namespaces.php这是composer附带的PSR-0自动加载的配置
现在您提到您有自己的PSR-0类加载器,不应该将其用于composer依赖项-您只需要要求/包括vendor/autoload.php并让composer负责其余部分。
这就是为什么没有选项可以禁用自动加载文件的生成。最终,composer应该使您能够使用已安装的库,并通过提供所需的所有加载来启用您。
不幸的是,Composer似乎不支持此功能:https://github.com/composer/composer/issues/1663
在我的CMS EFFCORE中,我使用了以下解决方案。。。
对于UNIX shell:
文件composer.json
"scripts": {
"post-install-cmd": [
"rm vendors/autoload.php",
"rm -rf vendors/composer"
],
"post-update-cmd": [
"rm vendors/autoload.php",
"rm -rf vendors/composer"
]
}
对于Win/Nix:
文件composer.json
"scripts": {
"post-install-cmd": [
"php vendors/post-install-cmd.php"
],
"post-update-cmd": [
"php vendors/post-install-cmd.php"
]
}
文件供应商/安装后cmd.php
# rm -rf vendors/packages/composer
if (file_exists('vendors/packages/composer/')) {
$composer_items = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('vendors/packages/composer/', FilesystemIterator::UNIX_PATHS|FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
foreach ($composer_items as $c_path => $c_spl_file_info) {
if ($c_spl_file_info->isFile()) {if (@unlink($c_path)) print "File '". $c_path. "' was removed.n";}
if ($c_spl_file_info->isDir ()) {if (@rmdir ($c_path)) print "Directory '". $c_path. "/' was removed.n";} }
if (@rmdir('vendors/packages/composer/')) {
print "Directory 'vendors/packages/composer/' was removed.n";
}
}
# rm vendors/packages/autoload.php
if (file_exists('vendors/packages/autoload.php') &&
@unlink('vendors/packages/autoload.php')) {
print "File 'vendors/packages/autoload.php' was removed.n";
}
install
和update
命令上有一个选项--no-autoloader
。
它在中实现https://github.com/composer/composer/pull/3453自2014年12月以来。
就我个人而言,我将这些文件添加到了.gitignore中,因为我正在处理的项目有一个自动加载器,可以很好地进行