2011-10-16 18:04:29 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This file is part of Composer.
|
|
|
|
*
|
|
|
|
* (c) Nils Adermann <naderman@naderman.de>
|
|
|
|
* Jordi Boggiano <j.boggiano@seld.be>
|
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Composer\Autoload;
|
|
|
|
|
|
|
|
use Composer\Installer\InstallationManager;
|
|
|
|
use Composer\Json\JsonFile;
|
|
|
|
use Composer\Package\Loader\JsonLoader;
|
|
|
|
use Composer\Package\PackageInterface;
|
|
|
|
use Composer\Repository\RepositoryInterface;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Igor Wiedler <igor@wiedler.ch>
|
2011-10-23 19:23:37 +00:00
|
|
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
2011-10-16 18:04:29 +00:00
|
|
|
*/
|
|
|
|
class AutoloadGenerator
|
|
|
|
{
|
2011-11-06 00:09:48 +00:00
|
|
|
public function dump(RepositoryInterface $localRepo, PackageInterface $mainPackage, InstallationManager $installationManager, $targetDir)
|
2011-10-16 18:04:29 +00:00
|
|
|
{
|
2011-10-30 19:29:06 +00:00
|
|
|
$autoloadFile = file_get_contents(__DIR__.'/ClassLoader.php');
|
|
|
|
|
|
|
|
$autoloadFile .= <<<'EOF'
|
|
|
|
|
|
|
|
// autoload.php generated by Composer
|
|
|
|
|
|
|
|
function init() {
|
|
|
|
$loader = new ClassLoader();
|
|
|
|
|
|
|
|
$map = require __DIR__.'/autoload_namespaces.php';
|
|
|
|
|
|
|
|
foreach ($map as $namespace => $path) {
|
|
|
|
$loader->add($namespace, $path);
|
|
|
|
}
|
|
|
|
|
|
|
|
$loader->register();
|
|
|
|
|
|
|
|
return $loader;
|
|
|
|
}
|
2011-10-16 18:04:29 +00:00
|
|
|
|
2011-10-30 19:29:06 +00:00
|
|
|
return init();
|
|
|
|
EOF;
|
2011-10-16 18:04:29 +00:00
|
|
|
|
2011-10-30 19:29:06 +00:00
|
|
|
$namespacesFile = <<<'EOF'
|
|
|
|
<?php
|
2011-10-29 05:24:30 +00:00
|
|
|
|
2011-10-30 19:29:06 +00:00
|
|
|
// autoload_namespace.php generated by Composer
|
2011-10-16 18:04:29 +00:00
|
|
|
|
2011-11-20 21:02:22 +00:00
|
|
|
$baseDir = dirname(__DIR__);
|
|
|
|
|
2011-10-30 19:29:06 +00:00
|
|
|
return array(
|
2011-10-16 18:04:29 +00:00
|
|
|
|
|
|
|
EOF;
|
|
|
|
|
2011-11-03 21:22:12 +00:00
|
|
|
// build package => install path map
|
|
|
|
$packageMap = array();
|
2011-11-06 00:09:48 +00:00
|
|
|
foreach ($localRepo->getPackages() as $installedPackage) {
|
2011-11-03 21:22:12 +00:00
|
|
|
$packageMap[] = array(
|
2011-11-06 00:09:48 +00:00
|
|
|
$installedPackage,
|
|
|
|
$installationManager->getInstallPath($installedPackage)
|
2011-11-03 21:22:12 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// add main package
|
2011-11-06 00:09:48 +00:00
|
|
|
$packageMap[] = array($mainPackage, '');
|
2011-11-03 21:22:12 +00:00
|
|
|
|
|
|
|
$autoloads = $this->parseAutoloads($packageMap);
|
2011-11-15 20:46:41 +00:00
|
|
|
$vendorPath = $installationManager->getVendorPath();
|
2011-10-30 19:29:06 +00:00
|
|
|
|
2011-11-21 10:33:30 +00:00
|
|
|
$realVendorPath = realpath($vendorPath);
|
|
|
|
$vendorPathDepth = substr_count(strtr(substr($realVendorPath, strlen(getcwd())), '\\', '/'), '/');
|
|
|
|
$appBaseDir = str_repeat('dirname(', $vendorPathDepth).'$baseDir'.str_repeat(')', $vendorPathDepth);
|
|
|
|
|
2011-10-24 10:03:11 +00:00
|
|
|
if (isset($autoloads['psr-0'])) {
|
|
|
|
foreach ($autoloads['psr-0'] as $def) {
|
2011-11-05 22:51:35 +00:00
|
|
|
if (!$this->isAbsolutePath($def['path'])) {
|
2011-11-21 10:33:30 +00:00
|
|
|
if (strpos($def['path'], $vendorPath) === 0) {
|
|
|
|
$def['path'] = substr($def['path'], strlen($vendorPath));
|
|
|
|
$baseDir = '$baseDir . ';
|
|
|
|
} else {
|
|
|
|
$def['path'] = '/'.$def['path'];
|
|
|
|
$baseDir = $appBaseDir . ' . ';
|
|
|
|
}
|
2011-11-05 22:51:35 +00:00
|
|
|
} else {
|
|
|
|
$baseDir = '';
|
|
|
|
}
|
2011-11-06 00:09:48 +00:00
|
|
|
$exportedPrefix = var_export($def['namespace'], true);
|
|
|
|
$exportedPath = var_export($def['path'], true);
|
2011-11-05 22:51:35 +00:00
|
|
|
$namespacesFile .= " $exportedPrefix => {$baseDir}{$exportedPath},\n";
|
2011-10-16 18:04:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-10-30 19:29:06 +00:00
|
|
|
$namespacesFile .= ");\n";
|
2011-10-16 18:04:29 +00:00
|
|
|
|
2011-10-30 19:29:06 +00:00
|
|
|
file_put_contents($targetDir.'/autoload.php', $autoloadFile);
|
|
|
|
file_put_contents($targetDir.'/autoload_namespaces.php', $namespacesFile);
|
2011-10-16 18:04:29 +00:00
|
|
|
}
|
|
|
|
|
2011-11-03 21:22:12 +00:00
|
|
|
/**
|
|
|
|
* Compiles an ordered list of namespace => path mappings
|
|
|
|
*
|
|
|
|
* @param array $packageMap array of array(package, installDir-relative-to-composer.json)
|
|
|
|
* @return array array('psr-0' => array(array('namespace' => 'Foo', 'path' => 'installDir')))
|
|
|
|
*/
|
|
|
|
public function parseAutoloads(array $packageMap)
|
2011-10-16 18:04:29 +00:00
|
|
|
{
|
|
|
|
$autoloads = array();
|
2011-11-03 21:22:12 +00:00
|
|
|
foreach ($packageMap as $item) {
|
2011-10-16 18:04:29 +00:00
|
|
|
list($package, $installPath) = $item;
|
|
|
|
|
|
|
|
if (null !== $package->getTargetDir()) {
|
|
|
|
$installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir()));
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($package->getAutoload() as $type => $mapping) {
|
2011-11-03 20:05:01 +00:00
|
|
|
foreach ($mapping as $namespace => $path) {
|
|
|
|
$autoloads[$type][] = array(
|
2011-11-07 08:28:48 +00:00
|
|
|
'namespace' => $namespace,
|
|
|
|
'path' => empty($installPath) ? $path : $installPath.'/'.$path,
|
2011-11-03 20:05:01 +00:00
|
|
|
);
|
|
|
|
}
|
2011-10-16 18:04:29 +00:00
|
|
|
}
|
2011-11-07 08:28:48 +00:00
|
|
|
|
2011-10-16 18:04:29 +00:00
|
|
|
}
|
|
|
|
|
2011-11-03 20:05:01 +00:00
|
|
|
foreach ($autoloads as $type => $maps) {
|
|
|
|
usort($autoloads[$type], function ($a, $b) {
|
|
|
|
return strcmp($b['namespace'], $a['namespace']);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2011-10-16 18:04:29 +00:00
|
|
|
return $autoloads;
|
|
|
|
}
|
2011-11-03 21:22:12 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers an autoloader based on an autoload map returned by parseAutoloads
|
|
|
|
*
|
|
|
|
* @param array $autoloads see parseAutoloads return value
|
|
|
|
* @return ClassLoader
|
|
|
|
*/
|
|
|
|
public function createLoader(array $autoloads)
|
|
|
|
{
|
|
|
|
$loader = new ClassLoader();
|
|
|
|
|
|
|
|
if (isset($autoloads['psr-0'])) {
|
|
|
|
foreach ($autoloads['psr-0'] as $def) {
|
2011-11-05 22:51:35 +00:00
|
|
|
$loader->add($def['namespace'], $def['path']);
|
2011-11-03 21:22:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $loader;
|
|
|
|
}
|
2011-11-05 22:51:35 +00:00
|
|
|
|
|
|
|
protected function isAbsolutePath($path)
|
|
|
|
{
|
|
|
|
return substr($path, 0, 1) === '/' || substr($path, 1, 1) === ':';
|
|
|
|
}
|
2011-10-16 18:04:29 +00:00
|
|
|
}
|