mirror of
https://github.com/composer/composer
synced 2025-05-09 00:22:53 +00:00
Add classmap-authoritative config setting
Add a "classmap-authoritative" configuration setting that can be used to disable searching the various prefix and fallback directories for classes that have not been registered with the Composer\Autoload\ClassLoader class map. This setting can be used to optimize performance by avoiding a potentially large number of `file_exists` calls when Composer is being used in a program with additional autoloader facilities. Use of the setting implies "optimize-autoloader" to ensure that the most complete class map possible is generated. Closes #3603
This commit is contained in:
parent
e172cd81a1
commit
ad1f8e6c5a
10 changed files with 110 additions and 18 deletions
|
@ -67,6 +67,11 @@ class AutoloadGeneratorTest extends TestCase
|
|||
*/
|
||||
private $eventDispatcher;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $configValueMap;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->fs = new Filesystem;
|
||||
|
@ -79,18 +84,23 @@ class AutoloadGeneratorTest extends TestCase
|
|||
|
||||
$this->config = $this->getMock('Composer\Config');
|
||||
|
||||
$this->config->expects($this->at(0))
|
||||
->method('get')
|
||||
->with($this->equalTo('vendor-dir'))
|
||||
->will($this->returnCallback(function () use ($that) {
|
||||
$this->configValueMap = array(
|
||||
'vendor-dir' => function () use ($that) {
|
||||
return $that->vendorDir;
|
||||
}));
|
||||
},
|
||||
);
|
||||
|
||||
$this->config->expects($this->at(1))
|
||||
$this->config->expects($this->atLeastOnce())
|
||||
->method('get')
|
||||
->with($this->equalTo('vendor-dir'))
|
||||
->will($this->returnCallback(function () use ($that) {
|
||||
return $that->vendorDir;
|
||||
->will($this->returnCallback(function ($arg) use ($that) {
|
||||
$ret = null;
|
||||
if (isset($that->configValueMap[$arg])) {
|
||||
$ret = $that->configValueMap[$arg];
|
||||
if (is_callable($ret)) {
|
||||
$ret = $ret();
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}));
|
||||
|
||||
$this->origDir = getcwd();
|
||||
|
@ -483,6 +493,49 @@ class AutoloadGeneratorTest extends TestCase
|
|||
include $this->vendorDir.'/composer/autoload_classmap.php'
|
||||
);
|
||||
$this->assertAutoloadFiles('classmap5', $this->vendorDir.'/composer', 'classmap');
|
||||
$this->assertNotRegExp('/\$loader->setClassMapAuthoritative\(true\);/', file_get_contents($this->vendorDir.'/composer/autoload_real.php'));
|
||||
}
|
||||
|
||||
public function testClassMapAutoloadingAuthoritative()
|
||||
{
|
||||
$package = new Package('a', '1.0', '1.0');
|
||||
|
||||
$packages = array();
|
||||
$packages[] = $a = new Package('a/a', '1.0', '1.0');
|
||||
$packages[] = $b = new Package('b/b', '1.0', '1.0');
|
||||
$packages[] = $c = new Package('c/c', '1.0', '1.0');
|
||||
$a->setAutoload(array('classmap' => array('')));
|
||||
$b->setAutoload(array('classmap' => array('test.php')));
|
||||
$c->setAutoload(array('classmap' => array('./')));
|
||||
|
||||
$this->repository->expects($this->once())
|
||||
->method('getCanonicalPackages')
|
||||
->will($this->returnValue($packages));
|
||||
|
||||
$this->configValueMap['classmap-authoritative'] = true;
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/composer');
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/a/a/src');
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/b/b');
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/c/c/foo');
|
||||
file_put_contents($this->vendorDir.'/a/a/src/a.php', '<?php class ClassMapFoo {}');
|
||||
file_put_contents($this->vendorDir.'/b/b/test.php', '<?php class ClassMapBar {}');
|
||||
file_put_contents($this->vendorDir.'/c/c/foo/test.php', '<?php class ClassMapBaz {}');
|
||||
|
||||
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', false, '_7');
|
||||
$this->assertTrue(file_exists($this->vendorDir.'/composer/autoload_classmap.php'), "ClassMap file needs to be generated.");
|
||||
$this->assertEquals(
|
||||
array(
|
||||
'ClassMapBar' => $this->vendorDir.'/b/b/test.php',
|
||||
'ClassMapBaz' => $this->vendorDir.'/c/c/foo/test.php',
|
||||
'ClassMapFoo' => $this->vendorDir.'/a/a/src/a.php',
|
||||
),
|
||||
include $this->vendorDir.'/composer/autoload_classmap.php'
|
||||
);
|
||||
$this->assertAutoloadFiles('classmap5', $this->vendorDir.'/composer', 'classmap');
|
||||
|
||||
$this->assertRegExp('/\$loader->setClassMapAuthoritative\(true\);/', file_get_contents($this->vendorDir.'/composer/autoload_real.php'));
|
||||
// FIXME: how can we actually test the ClassLoader implementation?
|
||||
}
|
||||
|
||||
public function testFilesAutoloadGeneration()
|
||||
|
@ -829,10 +882,7 @@ EOF;
|
|||
->method('getCanonicalPackages')
|
||||
->will($this->returnValue(array()));
|
||||
|
||||
$this->config->expects($this->at(2))
|
||||
->method('get')
|
||||
->with($this->equalTo('use-include-path'))
|
||||
->will($this->returnValue(true));
|
||||
$this->configValueMap['use-include-path'] = true;
|
||||
|
||||
$this->fs->ensureDirectoryExists($this->vendorDir.'/a');
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue