获取已安装的composer包的文件系统路径

时间:2013-03-30 03:56:56

标签: php composer-php

如何获取composer包的文件系统路径?

composer.json示例:

{

    "require" : {
        "codeception/codeception" : "@stable",
        "willdurand/geocoder": "*"
    }
}

例如: $composer->getPath("\Geocoder\HttpAdapter\HttpAdapterInterface");

并将其返回为: "/home/me/public_html/vendor/willdurand/geocoder/src/Geocoder/HttpAdapter"

4 个答案:

答案 0 :(得分:10)

所有这些都是基于这样的假设,即您实际上是在谈论而不是类(在示例中提到但在问题中没有被要求)。

如果您有Composer对象,则可以从Config对象获取供应商目录的路径:

    $vendorPath = $composer->getConfig()->get('vendor-dir');

$vendorPath现在应该包含/home/me/public_html/vendor/

从那里构建路径的其余部分不应该太难,因为你已经有了包名。

如果这感觉太脆弱或者您不想写逻辑,那么还有另一种解决方案。您可以获取所有包,迭代直到找到正确的包并从中获取路径:

    $repositoryManager = $composer->getRepositoryManager();
    $installationManager = $composer->getInstallationManager();
    $localRepository = $repositoryManager->getLocalRepository();

    $packages = $localRepository->getPackages();
    foreach ($packages as $package) {
        if ($package->getName() === 'willdurand/geocoder') {
            $installPath = $installationManager->getInstallPath($package);
            break;
        }
    }

$installPath现在应该包含/home/me/public_html/vendor/willdurand/geocoder

答案 1 :(得分:1)

Try ReflectionClass :: getFileName - 获取已定义类的文件的文件名。 http://www.php.net/manual/en/reflectionclass.getfilename.php

示例:

$reflector = new ReflectionClass("\Geocoder\HttpAdapter\HttpAdapterInterface");
echo $reflector->getFileName();

或者您可以使用此:

$loader = require './vendor/autoload.php';
echo $loader->findFile("\Geocoder\HttpAdapter\HttpAdapterInterface");

第一种方法尝试加载类并返回加载的类路径。第二个方法从composer数据库返回路径,没有类自动加载。

答案 2 :(得分:1)

以下是我在不使用$ composer对象的情况下获取供应商路径的解决方案:

<?php

namespace MyPackage;

use Composer\Autoload\ClassLoader;

class MyClass
{
    private function getVendorPath()
    {
        $reflector = new \ReflectionClass(ClassLoader::class);
        $vendorPath = preg_replace('/^(.*)\/composer\/ClassLoader\.php$/', '$1', $reflector->getFileName() );
        if($vendorPath && is_dir($vendorPath)) {
            return $vendorPath . '/';
        }
        throw new \RuntimeException('Unable to detect vendor path.');
    }
}

答案 3 :(得分:-1)

不确定以下是否是正确的方法因为作曲家变化如此之快。

如果您运行此命令:

php /path/to/composer.phar dump-autoload -o

它将在此文件中创建一个类图数组

vender/composer/autoload_classmap.php

使用此格式“classname”=&gt;文件路径。

所以找到给定类的文件路径很简单。如果在项目的根文件夹中创建脚本,则可以执行以下操作:

$classmap = require('vender/composer/autoload_classmap.php');
$filepath = $classmap[$classname]?: null;