diff --git a/res/composer-schema.json b/res/composer-schema.json index f95b4e91e..9db68ab07 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -146,6 +146,13 @@ "type": "string" } }, + "include-paths": { + "type": ["array"], + "description": "A list of directories which should get added to PHP's include path.", + "items": { + "type": "string" + } + }, "scripts": { "type": ["object"], "description": "Scripts listeners that will be executed before/after some events.", diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index dcab0ed6c..0278d48f8 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -35,6 +35,11 @@ if (!class_exists('Composer\\Autoload\\ClassLoader', false)) { require __DIR__.'/ClassLoader.php'; } +$includePaths = require __DIR__.'/include_paths.php'; +array_unshift($includePaths, get_include_path()); + +set_include_path(join(PATH_SEPARATOR, $includePaths)); + return call_user_func(function() { $loader = new \Composer\Autoload\ClassLoader(); @@ -134,6 +139,7 @@ EOF; file_put_contents($targetDir.'/autoload.php', $autoloadFile); file_put_contents($targetDir.'/autoload_namespaces.php', $namespacesFile); file_put_contents($targetDir.'/autoload_classmap.php', $classmapFile); + file_put_contents($targetDir.'/include_paths.php', $this->getIncludePathsFile($packageMap)); copy(__DIR__.'/ClassLoader.php', $targetDir.'/ClassLoader.php'); } @@ -205,4 +211,25 @@ EOF; return $loader; } + + protected function getIncludePathsFile(array $packageMap) + { + $includePaths = array(); + + foreach ($packageMap as $item) { + list($package, $installPath) = $item; + + if (null !== $package->getTargetDir()) { + $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir())); + } + + foreach ($package->getIncludePaths() as $includePath) { + $includePaths[] = empty($installPath) ? $includePath : $installPath.'/'.$includePath; + } + } + + return sprintf( + "aliasOf->getAutoload(); } + public function getIncludePaths() + { + return $this->aliasOf->getIncludePaths(); + } public function getRepositories() { return $this->aliasOf->getRepositories(); diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index 88dbc94a4..a72a50f81 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -169,6 +169,10 @@ class ArrayLoader $package->setAutoload($config['autoload']); } + if (isset($config['include-paths'])) { + $package->setIncludePaths($config['include-paths']); + } + return $package; } diff --git a/src/Composer/Package/MemoryPackage.php b/src/Composer/Package/MemoryPackage.php index 2c3502502..8944f9b47 100644 --- a/src/Composer/Package/MemoryPackage.php +++ b/src/Composer/Package/MemoryPackage.php @@ -56,6 +56,7 @@ class MemoryPackage extends BasePackage protected $recommends = array(); protected $suggests = array(); protected $autoload = array(); + protected $includePaths = array(); /** * Creates a new in memory package. @@ -623,4 +624,22 @@ class MemoryPackage extends BasePackage { return $this->autoload; } + + /** + * Sets the list of paths added to PHP's include path. + * + * @param array $includePaths List of directories. + */ + public function setIncludePaths(array $includePaths) + { + $this->includePaths = $includePaths; + } + + /** + * {@inheritDoc} + */ + public function getIncludePaths() + { + return $this->includePaths; + } } diff --git a/src/Composer/Package/PackageInterface.php b/src/Composer/Package/PackageInterface.php index 97997f093..ee2fcedc0 100644 --- a/src/Composer/Package/PackageInterface.php +++ b/src/Composer/Package/PackageInterface.php @@ -249,6 +249,14 @@ interface PackageInterface */ function getAutoload(); + /** + * Returns a list of directories which should get added to PHP's + * include path. + * + * @return array + */ + function getIncludePaths(); + /** * Returns an array of repositories *